繁体   English   中英

抽象类和纯方法C ++

[英]Abstract class and pure method C++

我已经读过一本书Stephen Prata-“ C ++ Primer Plus VI Edition”,在抽象类中,我可以编写纯方法的定义。 我知道我可以编写例如void pure() = 0 ,然后可以在此类中定义该方法。 我认为= 0只是使该类抽象,如果我使另一个类继承自该类,则不必覆盖它(我不知道“ overwrite”一词是否正确,我的意思是我要' t通过在辅助类中编写具有相同名称的方法来从基本类中隐藏该方法)。

我在编译器中检查了它,并得到警告“它没有替代程序”。 因此,如果我必须在辅助类中覆盖此纯虚拟方法(抽象类中具有定义),那么如何在基本类中使用此定义? 它没用吗?

您是否正在寻找这样的东西:

class Abstract {
public:
  virtual void f() = 0;
};

// A pure virtual function can still be defined.
// It has to be defined out-of-class.
void Abstract::f() {
  // Do something
}

class Concrete : public Abstract {
public:
  void f() {
    Abstract::f();  // call base class implementation
    // Do something more
  }
};

这是一个解释纯函数概念的示例

#include <iostream>

struct A
{
    virtual ~A() = default;
    virtual void what() const = 0;
};

void A::what() const 
{ 
    std::cout << "struct A"; 
}

struct B : A
{
    virtual void what() const = 0;
};

void B::what() const 
{ 
    A::what();
    std::cout << ", struct B : A"; 
}

struct C : B
{
    void what() const;
};

void C::what() const 
{ 
    B::what();
    std::cout << ", struct C: B"; 
}


int main() 
{
//  A a; compiler error
//  B b; compiler error
    C c;

    const A &rc = c;

    rc.what();
    std::cout << std::endl;

    return 0;
}

程序输出为

struct A, struct B : A, struct C: B

在此示例中,类A和B是抽象的,因为它们具有纯虚函数,尽管它们每个都提供了其纯虚函数的相应定义。

而且只有类C不是抽象的,因为它将虚函数重新声明为非纯虚函数。

如果要实例化继承的类,即创建此类型的对象,则必须在继承的类中实现所有纯虚方法。

换句话说,纯虚拟方法不仅定义了类接口,还迫使您提供其实际实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM