虚函数 继承

所谓虚函数就是多态情况下只执行一个,而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象,如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造,还有一个原因就是为了防错,试想如果你在子类中一不小心重写了个跟父类构造函数一样的函数,那么你的父类的构造函数将被覆盖,也即不能完成父类的构造.就会出错.
在构造函数不要调用虚函数。在基类构造的时候,虚函数是非虚,不会走到派生类中,既是采用的静态绑定。显然的是:当我们构造一个子类的对象时,先调用基类的构造函数,构造子类中基类部分,子类还没有构造,还没有初始化,如果在基类的构造中调用虚函数,如果可以的话就是调用一个还没有被初始化的对象,那是很危险的,所以C++中是不可以在构造父类对象部分的时候调用子类的虚函数实现。但是不是说你不可以那么写程序,你这么写,编译器也不会报错。只是你如果这么写的话编译器不会给你调用子类的实现,而是还是调用基类的实现。
在析构函数中也不要调用虚函数。在析构的时候会首先调用子类的析构函数,析构掉对象中的子类部分,然后在调用基类的析构函数析构基类部分,如果在基类的析构函数里面调用虚函数,会导致其调用已经析构了的子类对象里面的函数,这是非常危险的。
### 虚函数继承的关系 在 C++ 中,虚函数用于支持多态行为。当基类中的某个成员函数被声明为 `virtual` 后,在派生类中重写该函数时会自动成为虚函数[^4]。 #### 单一继承下的虚函数机制 单一继承下定义虚函数的方式如下: ```cpp class Base { public: virtual void show() const { std::cout << "Base\n"; } }; class Derived : public Base { public: void show() const override { std::cout << "Derived\n"; } // 自动视为虚函数 }; ``` 这里即使未显式标注 `override` 或者 `virtual` 关键字,由于是从基类继承而来并进行了覆盖操作,因此仍会被当作虚函数处理。 #### 多重继承场景 对于多重继承而言,如果多个父类中有相同签名的方法,则需特别注意避免二义性问题。此时可以利用完全限定名来指定具体调用哪个版本的方法;而为了确保正确的行为模式——即总是调用最深层级的派生类所提供的实现版本——应当保证这些同名方法均为虚函数。 ```cpp #include <iostream> using namespace std; // 基础类A拥有一个名为getName的虚函数 class A { public: virtual string getName() const { return "Class A"; } }; // 类B和C分别从A单继承,并各自实现了getName() class B : public A { public: string getName() const override { return "Class B"; } }; class C : public A { public: string getName() const override { return "Class C"; } }; int main(){ A* p; C obj_c; p=&obj_c; cout<<p->getName()<<endl; // 输出:"Class C" } ``` 上述例子展示了即便不是直接子类也能通过指针访问到最终派生类的对象所对应的虚函数版本。 #### 使用纯虚函数构建抽象接口 有时希望创建仅提供接口而不给出任何实际功能的具体形式,这时就可以采用含有至少一个纯虚函数(`=0`) 的类作为基础模板: ```cpp class Shape { public: virtual double area() const = 0; // 定义了一个纯虚函数 virtual ~Shape() {} // 析构也应设成虚函数以防止资源泄漏 }; class Circle : public Shape { private: double radius_; public: explicit Circle(double r) :radius_(r){} double area() const override{ return M_PI * pow(radius_,2); } }; ``` 以上代码片段说明了如何借助于纯虚函数建立起一种强制性的契约关系,使得所有非叶子节点都必须去完成特定职责的规定动作[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值