我想知道" 虚拟基类 "是什么以及它意味着什么.
让我举个例子:
class Foo
{
public:
void DoSomething() { /* ... */ }
};
class Bar : public virtual Foo
{
public:
void DoSpecific() { /* ... */ }
};
Run Code Online (Sandbox Code Playgroud) 我在阅读c ++中的虚拟继承时在网站上发现了这个
使用多重继承时,有时需要使用虚拟继承.一个很好的例子是标准的iostream类层次结构:
//Note: this is a simplified description of iostream classes
class ostream: virtual public ios { /*..*/ }
class istream: virtual public ios { /*..*/ }
class iostream : public istream, public ostream { /*..*/ }
//a single ios inherited
Run Code Online (Sandbox Code Playgroud)
C++如何确保只存在虚拟成员的单个实例,而不管从中派生的类的数量是多少?C++使用额外的间接级别来访问虚拟类,通常是通过指针.换句话说,iostream层次结构中的每个对象都有一个指向ios对象的共享实例的指针.额外的间接级别有轻微的性能开销,但这是一个很小的代价.
我对声明感到困惑:
C++使用额外的间接级别来访问虚拟类,通常是通过指针
任何人都能解释一下吗?
c++ inheritance multiple-inheritance virtual-inheritance object-layout
我正在阅读关于继承的内容,我有一个我几个小时都无法解决的重大问题:
鉴于一个类Bar是一个具有virtual函数的类,
class Bar
{
virtual void Cook();
};
Run Code Online (Sandbox Code Playgroud)
有什么不同:
class Foo : public Bar
{
virtual void Cook();
};
Run Code Online (Sandbox Code Playgroud)
和
class Foo : public virtual Bar
{
virtual void Cook();
};
Run Code Online (Sandbox Code Playgroud)
?谷歌搜索和阅读的时间提供了大量有关其用途的信息,但实际上没有人告诉我两者之间有什么区别,只是让我更加困惑.
我正在阅读关于虚拟继承的维基百科文章.我跟着整篇文章,但我真的不能遵循最后一段
这是通过自,例如,提供哺乳动物和WingedAnimal用虚表指针(或"vpointer")来实现,存储器的哺乳动物及其动物部分的开始之间的偏移是未知的,直到运行时.因此蝙蝠成为(vpointer,哺乳动物,vpointer,WingedAnimal,蝙蝠,动物).有两个vtable指针,每个继承层次结构一个,实际上继承了Animal.在这个例子中,一个用于哺乳动物,一个用于WingedAnimal.因此,对象大小增加了两个指针,但现在只有一个Animal,没有歧义.Bat类型的所有对象都具有相同的vpointers,但每个Bat对象将包含其自己的唯一Animal对象.如果另一个类继承自Mammal,例如Squirrel,然后在松鼠的哺乳动物对象的vpointer将从在一个蝙蝠的哺乳动物对象的vpointer不同,尽管它们仍然可以在该对象的松鼠部分具有的大小与蝙蝠相同的特殊情况下基本上相同的因为那时从哺乳动物到动物部分的距离是相同的.vtable并不是真的相同,但它们中的所有基本信息(距离)都是.
有人可以对此有所了解.