gpt4 book ai didi

c++ - 使用从 B 继承的具体函数实现从 A 继承的虚函数

转载 作者:太空宇宙 更新时间:2023-11-04 12:40:20 25 4
gpt4 key购买 nike

假设我有一个接口(interface)类和一个部分实现类。另外,假设我绝对不希望这个部分实现继承自接口(interface):

class interface {
virtual void fnA() const = 0;
virtual void fnB() const = 0;
};

class partialImplementation { //Do not want to inherit from interface!
void fnA() const {cout << "fnA from partial implementation" << endl;}
//fnB() not implemented
};

我的想法是,我计划创建几个新类都继承该接口(interface),但我想在每个类中实现相同的 fnA()。所以,在继承接口(interface)之后,也许我也可以继承部分实现,希望fnA()得到实现。例如,

class myClass : interface, partialImplementation {
//would like fnA() to be implemented by partialImplementation
void fnB() const {cout << "fnB from myClass" << endl;}
};

当然,如果你试图实例化这个类,你会得到这个错误:

main.cpp: In function 'int main()':
main.cpp:235:10: error: cannot declare variable 'm' to be of abstract type 'myClass'
main.cpp:201:7: note: because the following virtual functions are pure within 'myClass':
main.cpp:193:15: note: virtual void interface::fnA() const
Compilation failed.

在阅读了一些其他的 stackoverflow 帖子(比如 this 一个)之后,似乎唯一可用的解决方案是这样做:

class myClass : interface, partialImplementation {
public:
void fnB() const {cout << "fnB from myClass" << endl;}
void fnA() const {
partialImplementation::fnA();
}
};

在链接的帖子中,OP 不介意多输入三行。但是你可以想象,我实际上希望 partialImplementation 实现不止一个功能,而且每次我想创建一个继承此接口(interface)的新类时,我都可以一遍又一遍地输入相同的样板。

有谁知道不需要 partialImplementationinterface 继承的方法吗?

最佳答案

你不想要的选项

不清楚您打算做什么。但有一件事是肯定的:在您的解决方案中,partialImplementationfnA()fnA() 无关interface,因为这两个类是不相关的。此外,在 partialImplementation 中,此函数不是虚拟的。

因此,要将 partialImplementationfnA() 作为从接口(interface)派生的类中的虚函数,您公开的显式调​​用是唯一的方法继续。

如果你想摆脱样板代码,你必须使 partialImplementation 继承自 interface。它仍然是一个无法实例化的抽象类,因为 fnB() 仍然缺失。

class partialImplementation : public interface { ... };

class myClass : public partialImplementation {
public:
void fnB() const {cout << "fnB from myClass" << endl;}
};

想要组合多个部分实现?

不清楚您为什么不想要这种继承。如果你想在一个 mixin stile 中组合几个不同的部分实现,但你想避免有几个不同的接口(interface)子对象,你可以选择虚拟继承:

class partialImplementationA : public virtual interface { 
public:
void fnA() const {cout << "fnA from partial implementation A" << endl;}
};
class partialImplementationB : public virtual interface {
public:
void fnB() const {cout << "fnB from partial implementation B" << endl;}
};

class myClass : public virtual interface,
public partialImplementationA,
public partialImplementationB {
public:
};

Online demo

不便之处在于继承必须在所有级别上都声明为虚拟的。但它允许在没有样板代码的情况下实现您想做的事情。

关于c++ - 使用从 B 继承的具体函数实现从 A 继承的虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54505791/

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