Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过派生类C+访问派生类的基类+;_C++_Inheritance - Fatal编程技术网

C++ 通过派生类C+访问派生类的基类+;

C++ 通过派生类C+访问派生类的基类+;,c++,inheritance,C++,Inheritance,函数whoAmI()应该返回: I am a Man I am a Omnivore 但它只会返回两次“我是男人”: class Animal { public: string className; }; class Omnivore:public Animal { public: Omnivore() { className = "Omnivore"; } }; class Man:public Omnivore { public:

函数
whoAmI()
应该返回:

I am a Man
I am a Omnivore
但它只会返回两次“我是男人”:

class Animal
{
public:
  string className;
};

class Omnivore:public Animal
{
 public:
    Omnivore()
    {
        className = "Omnivore";
    }
};

class Man:public Omnivore
{
public:
    Man() {
        className = "Man";
    }
     void whoAmI()
     {
         cout << "I am a " << Omnivore::className << endl;
         cout << "I am a " << Omnivore::Animal::className << endl;
     }
};
类动物
{
公众:
字符串类名称;
};
杂食类:公共动物
{
公众:
杂食动物
{
className=“杂食”;
}
};
班长:公共杂食者
{
公众:
男子(){
className=“Man”;
}
void whoAmI()
{

cout只有一个
Animal::className
,它由
Animal
的构造函数初始化为空
std::string
,然后分配给
杂食动物
Omnivore
的构造函数分配,然后由
Man
的构造函数分配给
Man
。因此得到了相同的结果,因为它们引用了相同的数据成员

您可以让它们拥有自己的同名数据成员;但请注意,这不是一个好主意,派生类中的名称将隐藏基类中的名称

class Animal
{
public:
  string className;
};

class Omnivore:public Animal
{
 public:
    string className;
    Omnivore()
    {
        className = "Omnivore";
    }
};

class Man:public Omnivore
{
public:
    string className;
    Man() {
        className = "Man";
    }
     void whoAmI()
     {
         cout << "I am a " << Omnivore::className << endl;         // "Omnivore"
         cout << "I am a " << Omnivore::Animal::className << endl; // empty
         cout << "I am a " << className << endl;                   // "Man"
     }
};
类动物
{
公众:
字符串类名称;
};
杂食类:公共动物
{
公众:
字符串类名称;
杂食动物
{
className=“杂食”;
}
};
班长:公共杂食者
{
公众:
字符串类名称;
男子(){
className=“Man”;
}
void whoAmI()
{

cout通常是这样做的:

class Animal
{
public:
  static string className() { return "Man"; };
};

class Omnivore:public Animal
{
public:
  static string className() { return "Omnivore"; };
  void whoAmI()
  {
      cout << "I am a " << Omnivore::className() << endl;
      cout << "I am a " << Animal::className() << endl;
  }
};
类动物
{
公众:
静态字符串className(){返回“Man”;};
};
杂食类:公共动物
{
公众:
静态字符串className(){返回“杂食”;};
void whoAmI()
{

对于给定的
是否只有一个
类名
,无论您如何引用它。将
类名
设为一个(虚拟或静态)函数,它就会工作。请检查。您不能覆盖数据成员。而且,
whoAmI()
不会返回任何内容-它是
无效的