为什么这个简单的C++类层次结构无法表现出多态行为?

I G*_*ieb 1 c++ polymorphism

如果有人能通过以下行为启发我,我会很感激 - 我用一个简短的代码示例捕获了它:

//header.h

class base
{
public:
 base(int data):data1(data){}
 virtual int getData(){return data1;}
private:
 int data1;
};

class derived1 :public base
{
public:
 derived1(int data):base(data-1),data2(data){}
 virtual int getData(){return data2;}
private:
 int data2;
};

class derived2 :public derived1
{
public:
 derived2(int data):derived1(data-1),data3(data){}
 virtual int getData(){return data3;}
private:
 int data3;
};


//main.cpp

derived1 d1(20);
derived2 d2(10);

base& baseRefd1 = d1, baseRefd2 = d2; 

cout << "call to baseRefd1.getData() yields: " << baseRefd1.getData();
cout << "call to baseRefd2.getData() yields: " << baseRefd2.getData();

derived1& derived1Refd1 = d1, derived1Refd2 = d2; 

cout << "call to derived1Refd1.getData() yields: " << derived1Refd1.getData();
cout << "call to derived1Refd2.getData() yields: " << derived1Refd2.getData();
Run Code Online (Sandbox Code Playgroud)

并输出:

call to baseRefd1.getData() yields: 20  
call to baseRefd2.getData() yields: 8  

call to derived1Refd1.getData() yields: 20  
call to derived1Refd2.getData() yields: 9  
Run Code Online (Sandbox Code Playgroud)

如您所见,当基本引用用作单个派生级别的句柄时,我们获得多态性 - 调用的getData()版本是派生类的版本.

但是当相同的基本引用被用作层次结构中派生的2级别的类的句柄时,没有多态性 - 所调用的getData的版本是基础的版本.

当使用类型为derived1的引用时,即层次结构的中间层引用时,即使句柄指向类1级别,也没有多态性.

我相信我需要在这里学到一些基本知识.将欣赏任何指导.

Jam*_*lis 13

base& baseRefd1 = d1, baseRefd2 = d2;  
Run Code Online (Sandbox Code Playgroud)

这是一样的

base& baseRefd1 = d1;
base  baseRefd2 = d2;  
    ^ baseRefd2 is not a reference!
Run Code Online (Sandbox Code Playgroud)

你需要另一个&符号:

base& baseRefd1 = d1, & baseRefd2 = d2;  
                      ^ this makes baseRefd2 a reference
Run Code Online (Sandbox Code Playgroud)

这是遵循规则的最佳理由之一"一次只声明一个变量,特别是在声明指针或引用时".

  • 只是不要在一个语句中声明多个变量,这就成了一个问题. (3认同)