基类的成员显示不是子类成员
时间: 2024-05-30 21:11:55 浏览: 11
是的,基类的成员函数和成员变量在子类对象中是存在的,但是如果想要访问子类中的成员,需要在子类中重新定义同名的成员函数或变量来覆盖基类中的同名成员。如果没有重新定义同名成员,那么在子类对象中访问该成员时,会默认访问到基类中的同名成员。这就是所谓的隐藏。如果想要在子类中访问基类中的同名成员,可以使用作用域解析运算符"::"来指定访问基类的成员。
相关问题
在基类可以用子类的成员函数吗
在基类中可以通过调用子类对象的成员函数来访问子类的成员函数,但是需要将基类的成员函数设置为虚函数,以便在运行时根据对象的实际类型调用正确的成员函数。这一特性称为多态性。例如:
```c++
class Base {
public:
virtual void func() {
std::cout << "Base::func() called." << std::endl;
}
};
class Derived : public Base {
public:
void func() override {
std::cout << "Derived::func() called." << std::endl;
}
void derivedFunc() {
std::cout << "Derived::derivedFunc() called." << std::endl;
}
};
int main() {
Base* basePtr = new Derived();
basePtr->func(); // 输出 "Derived::func() called."
//basePtr->derivedFunc(); // 错误,Base 类型没有 derivedFunc 函数
delete basePtr;
return 0;
}
```
在上面的例子中,基类 `Base` 中定义了虚函数 `func`,派生类 `Derived` 重写了该函数,并添加了一个新的成员函数 `derivedFunc`。在 `main` 函数中,通过基类指针 `Base*` 指向一个派生类对象 `Derived`,然后调用 `func` 函数,由于该函数是虚函数,因此会根据对象的实际类型调用正确的函数。虽然 `basePtr` 的类型是 `Base*`,但是它指向的是一个 `Derived` 对象,因此能够访问 `Derived` 类的成员函数,但不能直接访问 `Derived` 类独有的成员函数 `derivedFunc`。
可以将基类对象赋值给子类对象吗
不可以将基类对象直接赋值给子类对象。子类对象包含了基类对象的所有成员,同时还有自己独有的成员,所以子类对象的内存布局与基类对象是不同的。如果直接将基类对象赋值给子类对象,会造成内存布局不匹配的错误。
但是可以通过引用或指针来实现将基类对象赋值给子类对象。当将基类对象的地址赋值给子类对象的指针或引用时,编译器会进行自动类型转换。对于指针或引用类型的变量,它们的内存布局是相同的,因此可以通过指针或引用来实现基类对象到子类对象的类型转换。需要注意的是,在进行这种类型转换时,需要确保基类对象的实际类型与子类对象的类型相兼容,否则会导致运行时错误。