为什么我不能在多重继承 c++ 中使用"using"?



我尝试实现一些接口及其子接口。这是我的想法:

Interface
/       
Interface2    InterfaceDefination
|        /
Interface2Defination  

这是我的代码:

#include <iostream>
class Interface {
public:
virtual void method1() = 0;
virtual void print() = 0;
};
class Interface2 : public Interface {
public:
virtual void method2() = 0;
};
class InterfaceDefination : public Interface {
public:
virtual void method1() override {
std::cout << "method1 from InterfaceDefinationn";
}
};
class Interface2Defination : public Interface2, public InterfaceDefination {
public:
using InterfaceDefination::method1;
virtual void print() override {
std::cout << "print from Interface2Definationn";
}
virtual void method2() override {
std::cout << "method2 from Interface2Definationn";
}
};
int main() {
Interface2Defination c;
c.method1();
c.method2();
c.print();
}

我的预期输出是:

method1 from InterfaceDefination
method2 from Interface2Defination
print from Interface2Defination

但我意外地收到了这些错误:

main.cpp:33:24: error: variable type 'Interface2Defination' is an abstract class
Interface2Defination c;
^
main.cpp:5:16: note: unimplemented pure virtual method 'method1' in 'Interface2Defination'
virtual void method1() = 0;
^
1 error generated.
make: *** [<builtin>: main.o] Error 1
exit status 2

https://godbolt.org/z/9ncoGfn4P

在这种情况下,错误意味着using关键字没有使方法method1在类Interface2Defination中可用。我该怎么办?

using声明是声明。它不是定义。它没有定义任何";新的";。它所做的是声明:好吧,我有一个符号X,但它实际上指的是我的父类中的X(对于using声明的这个版本(。

你可能会问,这有什么意义,你不是以正常的方式从父类继承了X吗。是的,这是真的,但这不是一回事,但技术差异在这里大多无关紧要。

这里同样重要的是,所显示的图表具有误导性。这是一种流行的描绘(非虚拟(钻石遗产的方式,但每次展示都是100%错误的。这是因为Interface2Defination没有继承Interface一个实例,而是继承两个。这是一个更准确的继承图:

Interface          Interface
|                |
Interface2    InterfaceDefination
|        /
Interface2Defination

对于Interface父类的两个实例中的每一个,只有其抽象方法中的一个被定义和重写,因此显示的代码格式不正确。

using声明不在子类中定义导入的方法,并正式覆盖它;计数";以便覆盖抽象方法。只有正式定义继承的抽象方法才能做到这一点,而不是声明一个。

目前,Interface2Defination中有两个Interface::method1,其中只有一个实现。如果您实际上继承了Interface,那么您就有了一个具有定义的CCD_13。

#include <iostream>
class Interface {
public:
virtual void method1() = 0;
virtual void print() = 0;
};
class Interface2 : public virtual Interface {
public:
virtual void method2() = 0;
};
class InterfaceDefination : public virtual Interface {
public:
virtual void method1() override {
std::cout << "method1 from InterfaceDefinationn";
}
};
class Interface2Defination : public Interface2, public InterfaceDefination {
public:
virtual void print() override {
std::cout << "print from Interface2Definationn";
}
virtual void method2() override {
std::cout << "method2 from Interface2Definationn";
}
};
int main() {
Interface2Defination c;
c.method1();
c.method2();
c.print();
}

最新更新