c++ - 派生类调用基类对象的方法

标签 c++ linux inheritance gcc vtable

我写了几行我认为不应该编译的代码。我在指向基类对象的 static_cast-ed 指针上调用派生类的方法,如下所示:

class B {};    

class D: public B
{
public:
    void bar() { printf("%d\n", m_i); }
private:
    int m_i;
};

int main()
{
    B b;
    D* d = static_cast<D*>(&b);
    d->bar();
    return 0;
}

打印的值显然是垃圾,但它是否应该编译? gcc 如何做到这一点?

最佳答案

gcc 不能保证它是不正确的,除非在少数情况下确实不值得检查。当您使用 static_cast 时,您就是在向编译器保证您知道自己在做什么。

这里有两种类型的转换。 static_cast,也就是说,您告诉编译器指向基的指针是指向派生的指针,闭嘴并继续处理它。 dynamic_cast,也就是说,您要求编译器检查指向 base 的指针是否确实是指向 derived 的指针。您使用了 static_cast,因此编译器关闭并按照您说的去做。

编辑:John 准确地指出,在您的继承层次结构中没有虚函数,为此您应该从 C++ 中解雇,并且 dynamic_cast 仅对虚函数有效。

关于c++ - 派生类调用基类对象的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4607615/

相关文章:

c - 是否可以为执行的子进程更改 "/proc/self/exe"的值?

c++ - 虚拟纯函数

Java静态或继承变量

c++ - 对于繁重的写入应用程序,iostream::rdbuf() 的最佳大小是多少?

c++ - 此处如何使用逗号运算符?

linux - 在 ubuntu live disk 中运行 docker

mysql - SQL n :m Inheritance join

c++ - LoadLibrary 找不到 ntoskrnl

c++ - 什么是复合类型?

linux - 运行时意外的文件结尾