【问题标题】:Is an abstract method in c++ ever called?曾经调用过 c++ 中的抽象方法吗?
【发布时间】:2018-06-25 09:20:55
【问题描述】:

假设我有一个抽象类,其中包含一个名为print 的函数。假设我有另一个类继承自老类并定义函数print。 可以说老类函数print 永远不会被调用吗? 我的辩论是在我有一个长辈指针指向一个孩子的情况下进行的。我使用这个指针调用print 函数。除非我将函数声明为virtual,否则它应该尝试使用抽象函数。但它不能,这就是我卡住的地方。 提前致谢。

编辑:我添加了一个示例。感谢这个建议,因为它解决了我的问题。不存在非虚拟抽象方法之类的东西。

// Example program
#include <iostream>
using namespace std;

class A{
public:
 void print()=0;//I have to add virtual before declaring function
};
void A::print(){
    cout<<"1"<<endl;
    }

class B: public A{
    public:
    void print(){cout<<"2"<<endl;}
    };

int main(){
  B b;
  b.print();
  A* a=&b;
  a->print();
  b.A::print();//here I called the abstract method
  return 0;
}

【问题讨论】:

  • 你在代码上试过了吗?
  • 你总是可以明确地调用它,例如p-&gt;Base::foo();
  • 等一下。如果你没有virtual 函数,你就不能拥有一个抽象类。至少在“抽象”一词的 C++ 运行时多态意义上不是。你能澄清一下吗?最好有实际代码。
  • 阅读文档通常会有所帮助:en.cppreference.com/w/cpp/language/virtual
  • 如果你实际使用一些代码进行演示,你的问题会更清楚。

标签: c++ function class abstract


【解决方案1】:

假设我有一个带有名为“print”的函数的抽象类。假设我有另一个类继承自父类并定义了函数 print。说永远不会调用“父”类函数 print 对吗?

没有。

我的辩论是在我有一个“父亲”指针指向“儿子”的情况下进行的。我使用这个指针调用打印函数。除非我将函数声明为虚拟函数,否则它应该尝试使用抽象函数。

是的,所以如果不是virtual,就会调用“父亲”函数(或者,至少会尝试这样做)。这回答了您之前的问题。

如果是virtual,覆盖意味着将调用子函数。但是,如果为该函数提供了定义,仍然可以调用基本版本(例如,从子版本中),如 Father::print()

但它不能,这就是我卡住的地方。

我不明白你的意思。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 2012-09-21
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多