直接得到关于指针和参考的概念

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,但是当我在我的项目上做一些类设计时,我有点困扰我,并且我意识到由于库接口,我无法真正摆脱使用指针或引用和多态性问题.

Ben*_*igt 3

虽然您在第 1 点中有一些不错的想法,但实际上并不是这样的。转换不是就地完成的,它是通过创建一个新对象来完成的,该对象从转换源复制它所知道的成员(也就是说,基类成员,除非你的基类中有一些非常奇怪的前向声明) )。派生对象的实例不会以任何方式更改。当然,副本具有与原始对象不同的内存地址。按值传递总是涉及复制。