C++是面向对象的,那么存在继承关系时,下面四个问题,请作答!
1. 那么父类对象可以赋值给派生类对象吗?
2. 派生类对象能赋值给父类对象吗?
3. 能用父类指针指向派生类对象吗?
4. 能用派生类指针指向父类对象吗?
实现如下继承:父类animal 和 子类 dog
那么派生类dog对象的内存分布如下图
继续回答上述问题:
1. 那么父类对象可以赋值给派生类对象吗?
不能,因为父类对象无法为派生类独有的成员赋值,导致赋值失败!!!
2. 派生类对象能赋值给父类对象吗?
可以,因为派生类对象中有父类中的内容
3. 能用父类指针指向派生类对象吗?
可以,因为派生类中有父类的部分,那么父类指针其实只会指向派生类中从派生类中继承过来的部分。
4. 能用派生类指针指向父类对象吗?
不可以,因为派生类指针寻址范围大于父类的内存,导致访问未知内存。
编程进行验证
#include<iostream>
using namespace std;
class animal {
private:
int temp;
public:
virtual void speak() {
std::cout<< "animal speak"<<std::endl;
}
void print() {
std:: cout<<"animal"<<std::endl;
}
};
class dog : public animal {
private:
int tmp;
public:
void speak() override { //改写继承的虚函数
std::cout << "dog speak! "<<std::endl;
}
void speak(int i) { //"并不是改写继承的虚函数, 而是子类独有的函数"
std::cout<<"dog i speak! "<<std::endl;
}
void print() {
std::cout<<"dog"<<std::endl;
}
};
int main() {
dog d;
animal a1;
a1.speak();
a1.print();
animal *a2 = new animal;
a2 -> speak();
a2 ->print();
animal *a3 = new dog;
a3->speak();
a3->print();
//派生类对象可以赋值给基类对象,而基类对象不能赋值给派生类对象
a1 = d;
//d = a1; //错误,基类对象不能给派生类对象赋值;
//dog *d = new animal; //错误,派生类指针不能指向基类对象
delete a2;
delete a3;
return 0;
}