gpt4 book ai didi

c++ - 在具有多层继承的结构中设置 cout 支持

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

#include <iostream>
#include <string>

struct Printable abstract
{
friend std::ostream& operator<<(std::ostream& cout, const Printable& obj)
{
obj.print(cout);

return cout;
}

virtual void print(std::ostream& cout) const = 0;
};

struct VirtualBase abstract : public Printable
{
//stuff
};

struct Named abstract : public Printable
{
std::string name;

void print(std::ostream& cout) const
{
cout << "Name: " << name;
}
};

struct DerivedA : public VirtualBase
{
void print(std::ostream& cout) const
{
cout << "DerivedA";
}
};

struct DerivedB : public VirtualBase, public Named
{
void print(std::ostream& cout) const
{
cout << "DerivedB";

dynamic_cast<const Named*>(this)->print(cout);
//Is there a better way to call Named::print?
}
};

由于 DerivedB 继承了 VirtualBase 和 Named,并且它们都继承了 Printable,所以我不能将 DerivedB 与 cout 一起使用。在继承层次结构的多层上获得 Printable 支持的最佳方法是什么?另外,在派生类的打印中调用 Named::print 的最简单方法是什么?

最佳答案

问题是因为DerivedBVirtualBase (这是一个 Printable )和一个 Named (这是一个 Printable ),所以 operator<<尝试转换 DerivedBPrintable , 但不能沮丧,因为它是两个 Printable对象,它不知道要向下转换到哪个对象。因为你只想要 DerivedB一个派生Printable对象,你必须使用虚拟继承

   normal inheritance:            virtual inheritance:
Printable Printable Printable
| | / \
VirtualBase Named VirtualBase Named
\ / \ /
DerivedB DerivedB

这很简单:

struct Named abstract : virtual public Printable
struct VirtualBase abstract : virtual public Printable

请注意,具有虚拟继承的类比没有虚拟继承的类更大,稍微更慢,但另一方面,C++ 是极少数能够做到这一点的语言之一所有

关于c++ - 在具有多层继承的结构中设置 cout 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9575576/

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