是否有可能通过增加基类指针来创建一个继承类的指针(c++)?



根据我所读到的,似乎派生对象的内存是按顺序与基类及其所有数据一起制作的,然后紧接着是继承树下的以下类。因此,如果我创建一个基类指针,它等于一个新的派生类对象,然后将其增加1(这实际上是将基类的大小添加到地址中),那么我将到达派生类吗?如果是这样,我可以用这种方式访问派生类的数据吗?

是,也不是。在最简单的情况下,它将在大多数情况下工作:

class Base {
public:
int v;
};
class Derived : public Base {
public:
int b;
};
int main() {
Derived d;
Base* p = &d;
p++;
// these will match on all compilers I'm aware of
printf("%p %pn", p, &d.b);
return 0;
}

对于单继承,这通常是您在大多数编译器中看到的(尽管我非常担心在生产代码中依赖于它!)

然而,遗憾的是事情并不总是那么简单!在c++中,我们经常有多重继承、虚拟继承、抽象基类和所有这些好东西。所以这是一个绝对行不通的场景!
struct Animal {
virtual ~Animal() = default;
virtual void Eat() {}
int a;
};
struct Mammal: Animal {
virtual void Breathe() {}
int b;
};
struct WingedAnimal: Animal {
virtual void Flap() {}
int c;
};
// A bat is a winged mammal
struct Bat: Mammal, WingedAnimal {
int d;
};
然而,有更安全的方法来处理上升转换(例如dynamic_cast,或您自己的RTTI系统)。您可能需要使用这些:)

最新更新