cpp通过基类指针只能访问派生类的成员变量,但是不能访问派生类的成员函数。为什么?
时间: 2024-03-30 11:34:51 浏览: 220
在 C++ 中,可以通过基类指针访问派生类的成员变量,但不能访问派生类的成员函数,这是因为在编译时期,编译器只能看到基类的声明,而无法看到派生类的具体实现细节。
因为派生类可能会重载基类的成员函数,因此在编译时期,编译器无法确定基类指针指向的对象的类型,进而无法确定调用哪个版本的成员函数。因此,如果要访问派生类的成员函数,需要使用虚函数。
通过将基类的成员函数声明为虚函数,可以在运行时期通过指针的实际类型调用派生类的成员函数,从而实现动态绑定。这就是多态性的基本实现机制。
相关问题
基类指针转换成派生类指针可不可以调用派生类对象成员
是的,基类指针转换成派生类指针后可以调用派生类对象成员。这是因为派生类继承了基类的所有成员,包括成员函数和成员变量。当基类指针指向派生类对象时,可以通过将基类指针转换为派生类指针来访问派生类对象的成员函数和成员变量。
下面是一个示例代码,演示了如何将基类指针转换为派生类指针并调用派生类对象的成员函数:
```cpp
#include <iostream>
using namespace std;
class Base {
public:
virtual void show() {
cout << "This is the base class" << endl;
}
};
class Derived : public Base {
public:
void show() {
cout << "This is the derived class" << endl;
}
void display() {
cout << "This is the display function of the derived class" << endl;
}
};
int main() {
Base *bptr;
Derived d;
bptr = &d;
bptr->show(); // 输出:This is the derived class
Derived *dptr = (Derived*)bptr;
dptr->display(); // 输出:This is the display function of the derived class
return 0;
}
```
基类指针指向派生类对象和派生类指针指向基类
基类指针是指向基类类型的变量,它可以存储基类的对象引用。当基类指针指向派生类的对象时,由于向下兼容性,这个指针可以成功地访问基类中公共或保护的数据成员,以及覆盖的虚函数。然而,它无法访问派生类特有的私有数据成员。
相反,派生类指针是专门用于存储派生类对象的,它可以直接操作派生类的所有成员,包括基类和派生类新增的部分。因此,派生类指针不仅可以访问基类的方法,还可以访问派生类的特有方法和数据。
举个例子:
```cpp
class Base {
public:
void baseMethod() { cout << "Base method" << endl; }
private:
int privateBaseData;
};
class Derived : public Base {
public:
void derivedMethod() { cout << "Derived method" << endl; }
// 新增的私有数据
int derivedPrivateData;
};
// 基类指针示例
Base* basePtr = new Derived(); // 这样做允许通过basePtr调用Derived的方法
basePtr->baseMethod(); // 输出:"Base method"
// 但是不能访问Derived特有的私有数据
// 派生类指针示例
Derived* derivedPtr = new Derived();
derivedPtr->baseMethod(); // 输出:"Base method"
derivedPtr->derivedMethod(); // 输出:"Derived method"
derivedPtr->derivedPrivateData; // 可以直接访问派生类的私有数据
```
阅读全文