当前位置:   article > 正文

C++第五章——多态与虚函数_静态函数可以是虚函数吗

静态函数可以是虚函数吗

一、问答题
1、 静态成员函数可以作为虚函数吗?
静态成员函数不可以是虚函数。静态函数是属于类的,不属于对象本身,自然无法有自己的虚函数表指针。
不能。因为静态成员函数是可以通过类名直接调用的,而虚函数必须通过对象调用,这样才可以确定到底调用哪个类中的函数,它们之间是相互矛盾的

2、 派生类中的虚函数和基类中的虚函数, 它们的函数返回值、 函数名、 函数参
数都必须相同吗?

必须相同。如果函数参数不同,当用指向派生类对象的基类指针,试图调用派生类中带参数的同名函数时,会报错(这时只能此指针只能调用基类中无参的那个函数);而返回值不同,使用基类指针调用此函数时也会直接报错,提示”重写虚函数的返回类型有差异”

3、 分析下面这段程序, 判断运行结果。
#include
using namespace std;
class A {
public:
virtual void func() {
cout << “fun in class A” << endl;
}
};
class B {
public:
virtual void func() {
cout << “func in class B” << endl;
}
};
class C :public A, public B {
public:
void func() {
cout << “func in class C” << endl;
}
};
int main() {
C c;
A & pa = c;
B & pb = c;
C & pc = c;
pa.func();
pb.func();
pc.func();
}

答: main函数中,通过使用引用,A类对象pa、B类对象pb、C类对象pc都指向了C类对象c,等同于基类(A、B)指针pa和pb,指向派生类(C)对象c。并且,func函数在基类A、B中都为虚函数,因此pa.func()和pb.func()实际上调用的是C类中的func函数。C类的应用pc指向自己类的对象c,因此pc.func()函数毫无疑问指的是自己类中的func函数

func in class C
func in class C
func in class C
  • 1
  • 2
  • 3


1、 编写程序, 以下面给出的 container 类作为基类, 建立 2 个直接派生类 cube
和 sphere, 分别用来表示正方体和球体, 要求, 每一个派生类中都要包含基类
container 中的两个纯虚函数, 用来计算正方体和球体的表面积和体积。

class container {
protected:
double radius;
public:
container(double radius) :radius(radius) {};
virtual double surface_area() = 0;
virtual double volume() = 0;
};
写出主程序, 并计算边长为 6 的正方体的表面积和体积, 以及半径为 5 的球体
的表面积和体积。
提示: 正方体表面积计算公式: 边长边长6。
正方体体积计算方式: 边长边长边长。
球体表面积计算公式: 43.14半径半径;
球体体积计算公式: 4/3
3.14半径半径*半径;

#include <iostream>
#include <iomanip>
using namespace std;

class container{
public:
    container(double radius):radius(radius){};
    virtual double surface_area() = 0;
    virtual double volume() = 0;

protected:
    double radius;
};
//container::container(double radius): m_radius(radius){}

class Cube:public container{
public:
    Cube(double radius):container(radius){};//构造函数,以基类中的radius变量为正方体的边长
    double surface_area();
    double volume();

};
double Cube::surface_area() {
    return 6 * radius * radius;
}
double Cube::volume() {
    return radius * radius * radius;
}


class Sphere:public container{
public:
    Sphere(double radius):container(radius){};//构造函数,以基类中的radius变量为正方体的边长
    double surface_area();
    double volume();
};
double Sphere::surface_area() {
    return 4 * 3.14 * radius * radius;
}
double Sphere::volume() {
    return 4/3 * 3.14 * radius * radius * radius;
}
int main() {
    container *cubes = new Cube(6);
    cout<<"6 cube surface_area() is : "<<cubes->surface_area()<<"volume is "<<cubes->volume()<<endl;
    container * spheres = new Sphere(5);
    cout<<"6 sphere surface_area() is : "<<spheres->surface_area()<<"volume is "<<spheres->volume()<<endl;

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/731477
推荐阅读
相关标签
  

闽ICP备14008679号