gpt4 book ai didi

c++ - 用并行基类方法覆盖纯虚方法?

转载 作者:行者123 更新时间:2023-11-30 05:04:24 26 4
gpt4 key购买 nike

假设我有类 Foo 和一个纯虚函数 say 和类 Bar 有一个方法 say 和我想实现继承自 FooBar 的类 FooBarFoo::say 覆盖>酒吧::说。我可以做如下事情:

#include <iostream>

class Foo {
public:
virtual void say() = 0;
};

class Bar {
public:
void say() {
std::cout <<"I am a Bar." << std::endl;
}
};

class FooBar : public Foo, public Bar {
public:
void say() override {
Bar::say();
}
};

int main() {
FooBar foobar;
foobar.say(); // I want to print "I am a Bar."
return 0;
}

但这只是使 FooBar::say 成为调用 Bar::say 的函数。这是一个非常小的烦恼,但有没有办法让 FooBar 直接用 Bar::say 覆盖 Foo::say?让 FooBar::say inline 可靠地完成这个吗?我意识到我可以使 Bar 继承自 Foo 并且 FooBar 仅继承自 Bar 但这不适合此示例类似于实际项目。

最佳答案

#include <iostream>

class ISay {
public:
virtual void say() = 0;
};

class Bar: public virtual ISay {
public:
void say() override {
std::cout <<"I am a Bar." << std::endl;
}
};

class FooBar : public virtual ISay, public Bar {};

int main() {
FooBar foobar;
foobar.say(); // Prints "I am a Bar."
}

这在虚拟继承中称为支配

有些人认为,为了支持这一点,应该始终虚拟地继承接口(interface)。


虚拟继承有两个主要成本(可能更多):

  • 虚拟继承的公共(public)类子对象的初始化,即最高基类,在最派生类中指定。忽略继承链中间类中的规范。
  • 成员函数调用可能会有一些开销,因为可能需要调整 this 指针。

关于c++ - 用并行基类方法覆盖纯虚方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48907742/

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