Xzh*_*hsh 5 c++ polymorphism pointers reference
我现在已经在学校编程了一段时间,我正在开展我的第一个独立大项目.我一直在发现很多关于编程的东西,这些东西我以前都不知道,而且它很棒.
然而,越来越多,我觉得我不再把C++理解为一种语言,我越深入研究它.在继续之前,我想直接得到关于引用和指针的一些(错误)概念,我希望你,stackoverflow,如果我错了,可以纠正我.
在此先感谢,我们走了!
1.在类之间进行转换时,实际转换的是虚拟表.
例:
class A{
public:
A() : x(0) {};
int x;
virtual void doStuff() {
cout << x <<endl;
}
};
class B : public A{
public:
B() : y(1) {};
int y;
virtual void doStuff() {
cout << y <<endl;
}
};
Run Code Online (Sandbox Code Playgroud)
如果我已经将类型B的对象b转换为A,那么内部会发生什么,b的虚拟表将被丢弃,并被替换为类型A的相应虚拟表,并且y的析构函数将被调用,因为没有更长的参考.类似地,b中的doStuff将指向A :: doStuff的函数地址而不是B :: doStuff.但是,指向x的地址将保持不变.
这意味着利用多态性的唯一方法是通过指针和引用
作为第1点的结果,在类的虚方法中利用多态的唯一方法是使用引用和指针,因为如果我们通过值传递,类本身将自动转换为基类.
例:
void doALotOfStuff(A a1, A a2) {
a1.doStuff();
a2.doStuff();
}
int main(){
A a;
B b;
doALotOfStuff(a,b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
会打印出来的
0
0
Run Code Online (Sandbox Code Playgroud)
因为编译器会生成代码将b转换为A.
3.此外,利用数组和STL容器的这种多态性的唯一方法是使用指针,因为引用无法存储
由于向量不可分配,因为引用不可分配,因此如果我想要一个基类向量,我需要创建一个A的指针向量,以保留类型B的元素的虚拟表.
对不起,如果这是TL; DR,但是当我在我的项目上做一些类设计时,我有点困扰我,并且我意识到由于库接口,我无法真正摆脱使用指针或引用和多态性问题.
虽然您在第 1 点中有一些不错的想法,但实际上并不是这样的。转换不是就地完成的,它是通过创建一个新对象来完成的,该对象从转换源复制它所知道的成员(也就是说,基类成员,除非你的基类中有一些非常奇怪的前向声明) )。派生对象的实例不会以任何方式更改。当然,副本具有与原始对象不同的内存地址。按值传递总是涉及复制。