我有两节课。基类是水果,派生类是苹果。我使用类型字符串来标识类的类型。但是,当我尝试访问类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
答案 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";
并实现虚拟函数以返回每个类的字符串。