纯虚函数调用

Posted

技术标签:

【中文标题】纯虚函数调用【英文标题】:pure virtual function calling 【发布时间】:2020-04-08 17:44:17 【问题描述】:

第一个printable(e) 给出了“实体”,但对于下一行,程序崩溃了。给出一些字符。让我知道错误。

#include<iostream>
using namespace std;

class A

public:
    virtual string getclassname() = 0;
;

class entity : public A

public:
    string getclassname() override
    
        cout << "entity" << endl;
    
;

class player : public entity

private:
    string m_name2;

public:
    player(const string& name2) // Creating a constructor
        :m_name2(name2) 

    string getname()
    
        return m_name2;
    
public:
    string getclassname() override
    
        cout << "player" << endl;
    
;

void printable(A* en)

    cout << en->getclassname() << endl;


int main()

    entity* e = new entity();
    player* p = new player("bird");

    printable(e);
    printable(p);

【问题讨论】:

⟼通过采用indentation style 并一致地应用它,这段代码可以受益匪浅。缩进传达了结构和意图,使我们更容易理解您的代码,而无需花费大量时间来破译它。 糟糕:main.cpp:20:5: error: no return statement in function returning non-void [-Werror=return-type] @FredLarson 刚刚看到了。 此外,建议在A 中定义一个虚拟析构函数,尽管您目前没有使用多态删除。 @FredLarson 我该怎么做。请您详细说明一下。 【参考方案1】:

您的getclassname() 函数不会返回任何内容,即使它承诺会返回。这会导致未定义的行为。您不应该打印,而是编写一个字符串:

string getclassname() override

    return "player";

【讨论】:

它有效,但它应该总是有一个“回报”。我不能用cout吗?但是为什么它正在打印实体而不是下一个。谢谢 @AdupaVasista:“返回”和“输出”是不同的东西。 cout 将输出到用户的控制台。 return 会将值发送到程序中的调用代码。 @FredLarson。谢谢你。明白了。 为什么打印实体后程序崩溃?任何的想法。谢谢 @AdupaVasista 因为这是像您一样违反语言规则的一种可能结果。你破坏了你的程序。如果你的书没有解释这一点,我会吃掉我的面具

以上是关于纯虚函数调用的主要内容,如果未能解决你的问题,请参考以下文章

纯虚函数调用

在 C# 中处理纯虚函数调用

抑制消息框 R6025 纯虚函数调用

Windows应用程序因纯虚函数调用而崩溃

使用基类中的函数静态调用纯虚函数的派生类实现

虚析构函数与纯虚函数