多继承第二继承类虚函数支持与虚继承带虚函数
多继承第二继承类虚函数支持与虚继承带虚函数
- 多继承第二继承类虚函数支持与虚继承带虚函数
- 1. 多继承第二继承对虚函数支持的影响(this 指针调整作用)
- 解释
- 2. 虚继承下的虚函数
- 示例代码
- 总结
1. 多继承第二继承对虚函数支持的影响(this 指针调整作用)
#include <iostream>class Base1 {
public:virtual void func() {std::cout << "Base1::func()" << std::endl;}virtual ~Base1() = default; // 添加虚析构函数
};class Base2 {
public:virtual void func() {std::cout << "Base2::func()" << std::endl;}virtual Base2* clone() {std::cout << "Base2::clone()" << std::endl;return new Base2(*this);}virtual ~Base2() = default; // 添加虚析构函数
};class Derived : public Base1, public Base2 {
public:void func() override {std::cout << "Derived::func()" << std::endl;}Derived* clone() override {std::cout << "Derived::clone()" << std::endl;return new Derived(*this);}
};int main() {// 通过指向第二个基类的指针调用继承类的虚函数时Base2* pb2 = new Derived();pb2->func(); // 调用 Derived::func()delete pb2;// 一个指向派生类的指针调用第二个基类中的虚函数时Derived* pd = new Derived();Base2* pb2_from_pd = pd;pb2_from_pd->func(); // 调用 Derived::func()delete pd;// 允许虚函数的返回值类型有所变化时Base2* pb1 = new Derived();Base2* pb2_clone = pb1->clone(); // 调用 Derived::clone()delete pb1;delete pb2_clone;return 0;
}
解释
-
通过指向第二个基类的指针调用继承类的虚函数时
Base2* pb2 = new Derived(); pb2->func(); // 调用 Derived::func()
在这段代码中,通过
Base2
指针pb2
调用Derived
类的虚函数func
时,编译器会调整this
指针以正确指向Derived
对象。 -
一个指向派生类的指针调用第二个基类中的虚函数时
Derived* pd = new Derived(); Base2* pb2_from_pd = pd; pb2_from_pd->func(); // 调用 Derived::func()
在这段代码中,通过
Derived
指针pd
调用Base2
类的虚函数func
时,编译器会调整this
指针以正确指向Derived
对象。 -
允许虚函数的返回值类型有所变化时
Base2* pb1 = new Derived(); Base2* pb2_clone = pb1->clone(); // 调用 Derived::clone()
在这段代码中,
Derived
类的虚函数clone
的返回值类型与基类不同,但通过Base2
指针pb1
调用clone
函数时,编译器会调整this
指针以正确指向Derived
对象。
2. 虚继承下的虚函数
虚继承是一种特殊的继承方式,用于解决多重继承中的菱形继承问题。在虚继承下,虚函数的行为与普通继承类似,但需要注意 this
指针的调整。
示例代码
以下是一个示例,展示了虚继承下的虚函数:
#include <iostream>class Base {
public:virtual void func() {std::cout << "Base::func()" << std::endl;}virtual ~Base() = default; // 添加虚析构函数
};class Derived1 : virtual public Base {
public:void func() override {std::cout << "Derived1::func()" << std::endl;}
};class Derived2 : virtual public Base {
public:void func() override {std::cout << "Derived2::func()" << std::endl;}
};class Final : public Derived1, public Derived2 {
public:void func() override {std::cout << "Final::func()" << std::endl;}
};int main() {Final f;Base* b = &f;b->func(); // 调用 Final::func()return 0;
}
总结
- 多继承下的虚函数支持:在多继承下,通过指向第二个基类的指针调用继承类的虚函数时,需要进行
this
指针的调整,以确保正确调用虚函数。 - 虚继承下的虚函数:在虚继承下,虚函数的行为与普通继承类似,但需要注意
this
指针的调整,以确保正确调用虚函数。