无法覆盖继承的静态const成员

时间:2018-11-28 14:49:37

标签: c++ oop overwrite static-members

我有两节课。基类是水果,派生类是苹果。我使用类型字符串来标识类的类型。但是,当我尝试访问类apple的实例的type()函数以获取其类型字符串的返回时,我得到了基类的类型字符串“ fruit”而不是“苹果”。该如何解决? 这是我的代码:

#include <string>
class fruit
{
public:
    std::string type();
private:
    static const std::string _typeStr;
}
const std::string fruit::_typeStr = "fruit";
std::string fruit::type()
{
    return _typeStr;
}
class apple:public fruit
{
private:
    static const std::string _typeStr;
}
const std::string apple::_typeStr = "apple";

在文件main.cpp中:

#include <iostream>
#include "fruit.h"
int main()
{
apple::apple a;
cout<<a.type()<<endl;
return 1;
}

在输出中:

fruit

2 个答案:

答案 0 :(得分:1)

一种选择是在构造函数中设置非静态变量_typeStr。

#include <iostream>
#include <string>

using namespace std;

class fruit
{
public:
    fruit()
        : _typeStr("fruit"){};
    fruit(const char *type)
        : _typeStr(type){};
    std::string type();

protected:
    const std::string _typeStr;
};

std::string fruit::type()
{
    return _typeStr;
}

class apple : public fruit
{
public:
    apple()
        : fruit("apple"){};
};

int main()
{
    apple a;
    cout << a.type() << endl;
    return 1;
}

答案 1 :(得分:0)

这行不通。

    std::string type();

这是一个固定功能,将返回fruit类型。佩里奥德。

如果您想用自己的方式做事,请使用虚函数:

#include <string>
class fruit
{
public:
    virtual ~fruit() = default;
    virtual const std::string& type(); // (return _typeStr)
private:
    static const std::string _typeStr;
}
const std::string fruit::_typeStr = "fruit";
std::string fruit::type()
{
    return _typeStr;
}
class apple:public fruit
{
public:
    const std::string& type() override; // (return _typeStr; will return apple::_typeStr)
private:
    static const std::string _typeStr;
}
const std::string apple::_typeStr = "apple";

并实现虚拟函数以返回每个类的字符串。