gpt4 book ai didi

C++:继承的类具有名称相同的纯虚函数。如何在我的基类中分别覆盖它们?

转载 作者:行者123 更新时间:2023-12-04 16:37:14 27 4
gpt4 key购买 nike

下面的代码说明了我的问题:

namespace foo1
{
class bar1
{
public:
virtual void fn() = 0; //this must remain pure virtual
};
};

namespace foo2
{
class bar2
{
public:
virtual void fn() = 0; //this must remain pure virtual
};
};

class bar3: public foo1::bar1, public foo2::bar2
{
public:

//can i separately override virtual functions from inherited
//classes that have the same name?

void foo1::bar1::fn() override {std::cout << "bar1";} //error
void foo2::bar2::fn() override {std::cout << "bar2";} //error
};

int main()
{
bar3* obj = new bar3();

((foo1::bar1*)obj)->fn(); //i want this to print "bar1"
((foo2::bar2*)obj)->fn(); //and this to print "bar2"
}

基本上,我希望能够覆盖继承的函数,这样只需将我的基类对象转换为其中一个继承类,我就可以调用不同的函数,即使它们具有相同的名称。这可能吗?

最佳答案

当然可以。

struct foo1bar1helper:public foo1::bar1{
void fn()final{foo1bar1fn();}
virtual void foo1bar1fn()=0;
};

现在 bar3 只是继承自它而不是 bar1 并覆盖 foo1bar1fn(),

bar2 做同样的事情。

您还可以使用 CRTP 来调度并取消额外的 vtable 查找;

template<class D>
struct foo1bar1helper:public foo1::bar1{
void fn()final{static_cast<D*>(this)->foo1bar1fn();}
};

template<class D>
struct foo2bar2helper:public foo2::bar2{
void fn()final{static_cast<D*>(this)->foo2bar2fn();}
};

class bar3:
public foo1bar1helper<bar3>,
public foo2bar2helper<bar3>
{
public:
void foo1bar1fn(){}
void foo2bar2fn(){}
};

关于C++:继承的类具有名称相同的纯虚函数。如何在我的基类中分别覆盖它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68324299/

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