gpt4 book ai didi

C++ 多继承顺序和虚函数

转载 作者:行者123 更新时间:2023-11-30 05:37:09 25 4
gpt4 key购买 nike

具有相同功能的抽象类的继承顺序重要吗?

class A {
public:
virtual void f1() = 0;
virtual void f2() = 0;
};

class B : public A {
public:
virtual void f1() { globalF1_B(); }
virtual void f2() { globalF2_B(); }
};

class C : public A {
public:
virtual void f1() { globalF1_C(); }
};

class D : public A, public B, public C { };

class E : public A, public C, public B { };

DE classes 是否相同,如果我这样写:

class D{
public:
virtual void f1() { globalF1_C(); }
virtual void f2() { globalF2_B(); }
};
class E {
public:
virtual void f1() { globalF1_B(); }
virtual void f2() { globalF2_B(); }
};

附言。我将 class A 继承到 class Dclass E 以防万一我忘记实现类 A 的功能。

最佳答案

不,不一样。除了提供的无效 C++ 代码外,我们还可以说:

在第一种情况下,您的类 D 和 E 有两个方法 f1()(一个继承自 B,一个继承自 C)和一个方法 f2()(继承自 C)。如果您能够构造一个 D 对象名称 d,那么 d.f1() 将被报告为一个歧义,您需要以这种方式澄清:d.B::f1( ) 或这个 d.C::f1()

而在第二种情况下,您的类将只有两个方法 f1()f2()

#include <iostream>
using namespace std;

class A {
public:
virtual void f1() = 0;
virtual void f2() = 0;
};

class B : public A {
public:
virtual void f1() { cout << "B::f1()" << endl; }
virtual void f2() { cout << "B::f2()" << endl; }
};

class C : public A {
public:
virtual void f1() { cout << "C::f1()" << endl; }
virtual void f2() { cout << "C::f2()" << endl; }
};

class D : public B, public C { };

class E : public C, public B { };

int main() {
D d;
// d.f1(); // t.cpp:28:5: error: member 'f1' found in multiple base classes of different types
d.C::f1();
d.B::f1();
}

关于C++ 多继承顺序和虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33349333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com