【问题标题】:New derived class from abstract classes来自抽象类的新派生类
【发布时间】:2018-09-12 07:37:48
【问题描述】:

我在创建新类对象时遇到了问题。

抽象类叫做 SimpleList,目前它自己不做任何事情。

template<class T>
class SimpleList {

public:
    string ListName;    

    SimpleList(){
    };
    string getName(){
        return ListName;
    };
};

template<class T> 
class Queue : public SimpleList<T> {

public:
    string ListName;    

    Queue(string& name){
        ListName = name;
    }   

    string getName(){
        return ListName;
    }
};

这里是我试图将“pQLi”分配给一个新队列的地方,其中队列是一个派生类。

SimpleList<int> *pQLi;

if (indicator == 'i' ){
    pQLi = new Queue<int>(name1);

}

但是无论我在队列之外打印出 pQLi 的名称(或从中访问任何数据,但在最简单的情况下),都只会出现 ' '。例如,如果我这样做

cout <<(*pQLi).getName() <<"\n";

不是打印出 ListName,而是出现一个空白字符

【问题讨论】:

  • 您在Queue 中重复了ListName 声明。 Queue::ListName 在您实例化 Queue 时设置。您通过指向SimpleList 的指针访问的是永远不会设置的SimpleQueue::ListName。
  • 在这种情况下如何通过指针访问队列中的数据?这可能吗?
  • @PasserBy - 最好覆盖std::list 和std::queue。
  • 使用您发布的代码,没有任何结果,因为它不会编译。发布minimal reproducible example。

标签: c++ abstract-class derived-class


【解决方案1】:

就这么简单。使您的基类 getName() virtual 如下所示。由于您关心指针的内容,因此您需要对象的后期绑定。

template<class T>
class SimpleList
{
public:
    string ListName;

    SimpleList() = default;
    virtual string getName(){
        return ListName;
    };
};

但是,我不明白,为什么您需要一个模板类。您还没有在任何地方使用过 type(T) 。 并尽可能尝试使用 initializer_list 并且智能指针在以下情况下很适合使用。我做了一个小的更正如下。希望这已经回答了你的问题。

#include <iostream>

template<class T>
class SimpleList
{
private:
    std::string ListName;
public:
    SimpleList() = default;
    virtual ~SimpleList(){}
    virtual const std::string& getName()const
    {   return ListName;    };
};

template<class T>
class Queue : public SimpleList<T>
{
private:
    std::string ListName;
public:
    Queue(const std::string& name)
        :ListName(name) {}

    const std::string& getName()const
    {   return ListName;    }
};

int main()
{
    SimpleList<int> *pQLi;

    char indicator = 'i';
    std::string name1 = "nothing";

    if (indicator == 'i' ){
    pQLi = new Queue<int>(name1);}

    std::cout <<(*pQLi).getName() <<"\n";

    delete pQLi;
    pQLi = nullptr;
    return 0;
}

【讨论】:

  • 谢谢! ...我仍然很难跟上事情,但至少我现在有了方向...
  • 我注意到代码只在成员函数为const时运行,这是为什么呢?
  • @MinyoungNa :也许这会帮助你得到一个想法。 stackoverflow.com/questions/2391679/…
  • 如果你删除了基中的 const 关键字,你也需要对派生做同样的事情,反之亦然。不过,推荐的问题也可以帮助您弄清楚。
  • 为什么Queue 中有成员ListName cum getter,尽管它已经从SimpleList 继承了成员?
猜你喜欢
  • 1970-01-01
  • 2011-02-01
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 2011-01-11
  • 2021-08-04
相关资源
最近更新 更多