cpp中基类的 private 成员是能够被继承的,并且(成员变量)会占用派生类对象的内存,它只是在派生类中不可见,导致无法使用罢了。对吗?
时间: 2024-03-31 21:33:44 浏览: 68
不完全正确。在C++中,基类的私有成员确实会被继承到派生类中,但是它们不能被直接访问。这是因为在继承关系中,派生类对象只能访问公有成员和保护成员,而不能访问基类的私有成员。
此外,基类的私有成员不会占用派生类对象的内存空间,因为它们是在基类对象中定义的。派生类的对象只包含派生类新增的成员变量和基类的公有和保护成员变量。
相关问题
派生类包含了从自己定义的新成员以及从基类继承而来的成员。 那么I派生类的对象,是否也包含了基类里的私有成员变量? 是简单的不可直接访问、还是直接就在没有包含? 请写出一个测试小程序、用于回答和演示这个问题
派生类确实包含了从基类继承的成员,包括公有成员和保护成员(默认为 protected),这些都是可以直接访问的。但是,基类的私有成员(private)在派生类中是不可直接访问的,因为访问权限限定在其自身类内。
为了演示这一点,我们可以编写一个简单的 C++ 程序:
```cpp
#include <iostream>
// 基类 Base
class Base {
public:
int publicVar = 10; // 公有成员
protected:
int protectedVar = 20; // 保护成员
private:
int privateVar = 30; // 私有成员
void showPublic() { std::cout << "Public Var: " << publicVar << "\n"; }
void showProtected() { std::cout << "Protected Var: " << protectedVar << "\n"; }
};
// 派生类 Derived
class Derived : public Base {
public:
void derivedMethod() {
// 可以访问基类的公有和保护成员
showPublic();
Base& baseRef = *this;
baseRef.showProtected();
// 但不能直接访问私有成员
// int priv = baseRef.privateVar; (这将导致编译错误)
}
void accessThroughBase() {
// 使用基类指针可以间接访问私有成员,但需要通过特定方式
Base* basePtr = this;
basePtr->privateVar = 40; // 虽然可以看到变化,但这是不推荐的做法
std::cout << "Indirectly accessing Private Var: " << basePtr->privateVar << "\n";
}
};
int main() {
Derived derivedObj;
derivedObj.derivedMethod();
derivedObj.accessThroughBase();
return 0;
}
```
在这个程序中,`Derived`类的对象虽然可以间接访问基类的私有成员,但通常不这样做,因为这违背了封装原则。运行这个程序,你会看到只有公有和保护成员的值可以显示出来。
基类指针指向派生类对象和派生类指针指向基类
基类指针是指向基类类型的变量,它可以存储基类的对象引用。当基类指针指向派生类的对象时,由于向下兼容性,这个指针可以成功地访问基类中公共或保护的数据成员,以及覆盖的虚函数。然而,它无法访问派生类特有的私有数据成员。
相反,派生类指针是专门用于存储派生类对象的,它可以直接操作派生类的所有成员,包括基类和派生类新增的部分。因此,派生类指针不仅可以访问基类的方法,还可以访问派生类的特有方法和数据。
举个例子:
```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; // 可以直接访问派生类的私有数据
```
阅读全文