c++ - 在 C++ 中,如何调用在抽象基类和派生类中都有定义的基类的虚函数定义?

标签 c++ polymorphism abstract-class virtual-functions

我们不能创建抽象类的对象,对吧?那么如何调用在抽象基类和派生类中都有定义的虚函数呢?我想在抽象基类中执行代码,但目前,我正在使用派生类的对象。

class T
{
   public:
   virtual int f1()=0;
   virtual int f2() { a = 5; return a }
}
class DT : public T
{
   public:
   int f1() { return 10; }
   int f2() { return 4; }
}

int main()
{
    T *t;
    t = new DT();
    ............
}

有什么方法可以使用对象 t 调用基类函数吗?如果不行,调用基类函数需要做什么?

最佳答案

就像调用任何其他基类实现一样:使用显式限定来绕过动态调度机制。

struct AbstractBase
{
  virtual void abstract() = 0;

  virtual bool concrete() { return false; }
};

struct Derived : AbstractBase
{
  void abstract() override {}

  bool concrete() override { return true; }
};

int main()
{
  // Use through object:
  Derived d;
  bool b = d.AbstractBase::concrete();
  assert(!b);

  // Use through pointer:
  AbstractBase *a = new Derived();
  b = a->AbstractBase::concrete();
  assert(!b);
}

关于c++ - 在 C++ 中,如何调用在抽象基类和派生类中都有定义的基类的虚函数定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38010286/

相关文章:

java - 是否有任何不属于动态多态性的覆盖

java - 抽象类中的方法返回实现它的类的实例

c++ - 对 TC++PL 第 4 版中的 Tuple 示例感到困惑

c++ - 差异算法 C++

c++ - 模板函数以外的 OCaml 多态性示例?

c# - 多态性——使用从接口(interface)继承的对象而不是直接使用接口(interface)

java - 方法不覆盖抽象父类(super class)

java - 在 Java 的多态性中使用抽象类是一种好的/常见的做法吗?

c++ - Linux/POSIX 相当于 C++ 代码中的 Win32 API TerminateProcess

c++ - 如何调试 STL/C++ 的 GCC/LD 链接过程