如何在 c++ 中通过基类引用访问派生类的对象?

How to access object of a derived class by base class reference in c++?

本文关键字:派生 访问 对象 引用 基类 c++      更新时间:2023-10-16

我会在C++阅读以下行:完整的参考书。我对此没有明确的想法。

References to Derived Types
Similar to the situation as described for pointers earlier, a base class reference can be
used to refer to an object of a derived class. The most common application of this is
found in function parameters. A base class reference parameter can receive objects of
the base class as well as any other type derived from that base.

我对以下代码有疑问:

#include<iostream>
using namespace std;

class base
{
protected:
int i;
public:
void seti(int num){i=num;}
int geti(){return i;}
};
class derived:public base
{
protected:
int j;
public:
void setj(int num){j=num;}
int getj(){return j;}
};

void refe(base &ob)
{
ob.seti(1);
ob.setj(2);
}
int main()
{
derived d;
refe(d);
cout<<d.geti();
cout<<"n"<<d.getj();
return 0;
}

当我编译代码时,它将通过以下错误:

D:Userssrilakshmikanthan.pDocumentssource codeex.cpp||In function 'void refe(base&)':|
D:Userssrilakshmikanthan.pDocumentssource codeex.cpp|28|error: 'class base' has no member named 
'setj'
=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 5 second(s)) ===

我也在函数 refe(( ((derived *(ob(.setj(2( 中这样投射; 这也显示了以下错误:

D:Userssrilakshmikanthan.pDocumentssource codeex.cpp||In function 'void refe(base&)':|
D:Userssrilakshmikanthan.pDocumentssource codeex.cpp|28|error: invalid cast from type 'base' to 
type 'derived*'
=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 3 second(s)) ===|

所以请在那本书中解释一下这句话。

您只能从基类引用调用派生类的虚函数,请参阅此处,

#include<iostream>
class Base
{
public:
virtual void fun()
{
std::cout<<"Base";
}
};
class Derived:public Base
{
public:
void fun()override
{
std::cout<<"Derived";
}
};
void myfun(Base &ob)
{
ob.fun();
}
int main()
{
Derived ob;
myfun(ob);
return 0;
}

输出:

Derived
Process returned 0 (0x0)   execution time : 0.266 s
Press any key to continue.

我也在函数 refe(( ((derived *(ob(.setj(2( 中这样投射;这也显示了以下错误:

投射到((derived &)ob).setj(2);这将起作用,因为它不是指针,而是引用