如果有人能通过以下行为启发我,我会很感激 - 我用一个简短的代码示例捕获了它:
//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)
这是遵循规则的最佳理由之一"一次只声明一个变量,特别是在声明指针或引用时".