Jue*_*gen 8 c++ virtual inheritance
说我们有这个:
class A
{
public:
virtual void foo() = 0;
};
class B: public A
{
public:
virtual void foo() = 0;
};
Run Code Online (Sandbox Code Playgroud)
编译器不会抛出错误,我猜它是因为B也是一个抽象类,因此它不必foo
从A 实现.但这样的构造意味着什么?
1)foo
B foo
从A 隐藏吗?
2)继承自B并且不是抽象类的第一个类,它必须提供两个实现,如:
class C: public B
{
public:
virtual void A::foo() {};
virtual void B::foo() {};
};
Run Code Online (Sandbox Code Playgroud)
编译器只会抱怨如果B::foo()
缺少实现,但它不会抱怨丢失A::foo()
.
总而言之:这是一种隐藏纯虚方法的方法吗?
Sho*_*hoe 10
当你第一次申报时:
class A
{
public:
virtual void foo() = 0;
};
Run Code Online (Sandbox Code Playgroud)
你宣称方法是foo
公共的,虚拟的和纯粹的.当一个类至少包含一个纯方法时,它被称为抽象.这是什么意思?这意味着该类无法实例化,因为它需要纯方法实现.
你显然可以从一个抽象类继承(我会说你被迫这样做,否则你需要一个你不使用的抽象类,除了提供一个继承的接口?)你也可以继承自抽象类而不实现父类的部分或全部纯方法; 在这种情况下,子类也是抽象的,这是您的类B的情况:
class B: public A
{
public:
virtual void foo() = 0;
};
Run Code Online (Sandbox Code Playgroud)
在B中,您可以轻松省略virtual void foo() = 0;
声明,因为该定义已经从基类继承.在这种情况下,类B是一个抽象类,因此无法实例化,就像A一样.
更直接地回答您的问题:
确实
foo
的B隐藏foo
从A?
不,不是的.他们都宣称一个纯粹的方法(实际上是相同的方法),因此没有什么可以隐藏的.
第一个继承自B并且不是抽象类的类,是否必须提供两个类似提供的实现?
不,当然不.如上所述,它们是相同的方法,因此如果C类必须提供foo
它的实现应该只实现foo
:
class C: public B
{
public:
virtual void foo() {};
};
Run Code Online (Sandbox Code Playgroud)
0)编译器不会抛出错误......
当您尝试实例化一个对象A
或B
它们是抽象的时,它会抛出一个错误.不是在你继承和宣布它们的时候.
1)B的foo是否隐藏了A的foo?
不,它A::foo
不会隐藏它.
2)继承自B并且不是抽象类的第一个类,它必须提供两个实现...
不.只需覆盖foo
并为其实现一个实现.
class C : public B
{
public:
virtual void foo()
{
std::cout << "ABCD" << std::endl;
}
};
int main()
{
C c;
A *a = &c;
a->foo(); // Prints ABCD string and proofs B::foo doesn't hide A::foo
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10906 次 |
最近记录: |