派生抽象类中的纯虚方法

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)fooB 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)


mas*_*oud 8

0)编译器不会抛出错误......

当您尝试实例化一个对象AB它们是抽象的时,它会抛出一个错误.不是在你继承和宣布它们的时候.

 

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)

  • 不,`B :: foo`与`A :: foo`不同,并且隐藏它(以及覆盖它). (2认同)