在实施之前调用虚函数

Uri*_*Uri 3 c++ virtual

所以我有这种设置

class Base
{
public:
  Base();
  virtual void parse() = 0;
};

Base::Base()
{
  parse();
} 

class Sub : public Base
{
public:
  Sub();
  void parse();
};

Sub::Sub() : Base() {}

void Sub::parse()
{
  // DO stuff
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否还有我可以做类似的事情,现在我得到一个错误,说我不能称之为纯粹的虚拟功能,这是有道理的.有没有我可以使用的关键字来完成这项工作?

我认为使parse()只是虚拟而不是纯虚拟会起作用,但我希望用户必须覆盖它.

sbi*_*sbi 10

在构造函数(或析构函数)中调用虚拟成员函数永远不会使您最终在派生类中的该函数的重写版本中.

原因是基类构造函数(析构函数)在派生类'构造函数(析构函数)之前(之后)执行.这意味着表示派生类的对象部分尚不存在(不再存在).并且无法在不存在的对象上调用成员函数.

您需要实现一种两阶段构造(不包含在语言中)以实现您想要的功能.通常,这是通过让包装类首先完全构造一个Sub对象然后再调用parse()它来完成的.