gpt4 book ai didi

c++ - 如何在 C++ 中合并两个共享相同基类的类?

转载 作者:搜寻专家 更新时间:2023-10-31 00:30:01 25 4
gpt4 key购买 nike

我举下面的例子来说明我的问题:

class Base
{
public:
virtual void do()=0;
}

class A: public Base
{
public:
void do();
};

class B: public Base
{
public:
void do();
}

class AB: public Base
{
public:
void do()
{
a_.do();
// if not succeed
{
b_.do();
}
}
private:
A a_;
B b_;

}

从上面的代码我们可以看出类A, BAB来自同一个基类。类 AB , 但是,需要调用两个类 A和类 B .这是我的问题:AB 类的潜在问题是什么? ?还有其他选择吗?

一个替代方案可能是:

class Base
{
public:
virtual void do()=0;
}

class A: public Base
{
public:
void do();
};

class B: public Base
{
public:
void do();
}

class AB: public A
{
public:
void do()
{
A::do();
// if not succeed
{
b_.do();
}
}
private:

B b_;

}

最佳答案

我不知道你真正想达到什么目的。但是,如果您的所有类都应该只有一份来自 Base 的实例数据拷贝,则您需要一个虚拟 Base 类。

您的第一个 AB 示例的问题是,您有三个!类 Base 的数据的倍数。一个来自继承 Base,一个作为 Member B 的一部分,它本身从 Base 派生,同样来自 Member A。这是你想要的吗?

我给你下面的片段,看看你如何在你的所有类实例中使用 Base 的精确拷贝。也许这就是你想要得到的?

我将一些数据添加到 Base 以查看在使用虚拟基类时构造是如何工作的。重要的是基类的构造函数不会被直接继承类的构造函数调用!您需要直接从最外层的构造函数调用构造函数,如 AB 类构造函数所示!

备注:仅当没有其他适合设计的情况下才应使用虚拟基类。通常需要这样的解决方案表明存在设计问题。但在编程中一如既往:如果这完全符合您的需求,那么从技术上讲绝对没问题。

class Base
{
private:
std::string text;

public:
Base( const std::string& str ): text(str) {}
virtual void Do() { std::cout << text << std::endl; }
};

class A: virtual public Base
{
public:
A():Base("Default from A") {}
void FuncA() { std::cout << "FuncA" << std::endl; }
void Do() { std::cout << "Via A" << std::endl; Base::Do();}
};

class B: virtual public Base
{
public:
B(): Base ("Default from B") {}
void FuncB() { std::cout << "FuncB" << std::endl; }
};

class AB: public A,B
{
public:
//Important to know that init of Base MUST be done from here and not from A nor B !!
AB( const std::string &s): Base(s) {}
void Do() { std::cout << "Via AB" << std::endl; Base::Do(); A::Do(); B::Do();}
};

int main()
{
A a;
a.Do();
std::cout << "####" << std::endl;

B b;
b.Do();
std::cout << "####" << std::endl;

AB ab("Hallo");
ab.Do();
std::cout << "####" << std::endl;
}

关于c++ - 如何在 C++ 中合并两个共享相同基类的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38563810/

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