cpp通过基类指针只能访问派生类的成员变量,但是不能访问派生类的成员函数。为什么?
时间: 2024-03-30 09:34:51 浏览: 19
在 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;
}
```
C++派生类中的成员函数能调用基类中的成员函数吗
是的,C++中派生类中的成员函数可以调用基类中的成员函数。派生类可以继承基类的公有成员函数和公有成员变量。当派生类中的成员函数需要调用基类中的成员函数时,可以使用作用域解析运算符 `::` 来调用基类中的成员函数。
例如,假设有一个基类 `BaseClass` 和一个派生类 `DerivedClass`,其中 `BaseClass` 有一个公有成员函数 `baseFunc()`:
```cpp
class BaseClass {
public:
void baseFunc() {
std::cout << "This is a function in the base class." << std::endl;
}
};
class DerivedClass : public BaseClass {
public:
void derivedFunc() {
std::cout << "This is a function in the derived class." << std::endl;
baseFunc(); // 调用基类中的成员函数
}
};
```
在派生类的成员函数 `derivedFunc()` 中,可以直接调用基类中的成员函数 `baseFunc()`。如果基类中的成员函数和派生类中的成员函数同名,可以使用作用域解析运算符 `::` 来显式地指定调用基类中的成员函数,例如:
```cpp
class BaseClass {
public:
void baseFunc() {
std::cout << "This is a function in the base class." << std::endl;
}
};
class DerivedClass : public BaseClass {
public:
void baseFunc() {
std::cout << "This is a function in the derived class." << std::endl;
BaseClass::baseFunc(); // 显式地调用基类中的成员函数
}
};
```
在派生类的成员函数 `baseFunc()` 中,可以使用 `BaseClass::baseFunc()` 显式地调用基类中的成员函数。