欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > C++ 函数语义学——多继承第二继承类虚函数支持与虚继承带虚函数

C++ 函数语义学——多继承第二继承类虚函数支持与虚继承带虚函数

2025/8/23 10:29:21 来源:https://blog.csdn.net/qq_68194402/article/details/141109087  浏览:    关键词:C++ 函数语义学——多继承第二继承类虚函数支持与虚继承带虚函数

多继承第二继承类虚函数支持与虚继承带虚函数

多继承第二继承类虚函数支持与虚继承带虚函数

    • 多继承第二继承类虚函数支持与虚继承带虚函数
      • 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;
}
解释
  1. 通过指向第二个基类的指针调用继承类的虚函数时

    Base2* pb2 = new Derived();
    pb2->func();  // 调用 Derived::func()
    

    在这段代码中,通过 Base2 指针 pb2 调用 Derived 类的虚函数 func 时,编译器会调整 this 指针以正确指向 Derived 对象。

  2. 一个指向派生类的指针调用第二个基类中的虚函数时

    Derived* pd = new Derived();
    Base2* pb2_from_pd = pd;
    pb2_from_pd->func();  // 调用 Derived::func()
    

    在这段代码中,通过 Derived 指针 pd 调用 Base2 类的虚函数 func 时,编译器会调整 this 指针以正确指向 Derived 对象。

  3. 允许虚函数的返回值类型有所变化时

    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 指针的调整,以确保正确调用虚函数。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词