取消引用类型化的void *对象指针

时间:2013-08-24 01:30:51

标签: c++ casting void-pointers

关于这段代码:

#include <iostream>

class CClass1
{
public:
    void print() {
        std::cout << "This should print first" << std::endl;
    }
};

class CClass2
{
public:
    void print() {
        std::cout << "This should print second" << std::endl;
    }
};

所以有人问了一个关于有一个&#34;自由指针的有趣问题&#34; (可以这么说),它可以指向不同对象的多个实例,而无需创建该对象的新类型。该人认为该指针可以是void *类型,并且因为它是无效的,所以可以使其指向对象的任何实例并访问对象的公共属性。

提交了以下解决方案:

int main() {
    void *pClass(NULL);
    ((CClass1 *)(pClass))->print();
    ((CClass2 *)(pClass))->print();
    std::cin.ignore();
    return 0;
}

我的问题是为什么上述工作,但这不是:

int main() {
    (CClass1 *FG)->print();
    (CClass2 *FG)->print();
    std::cin.ignore();
    return 0;
}

1 个答案:

答案 0 :(得分:1)

您的第一个示例通过未指向有效对象的指针调用非静态成员函数来展示未定义的行为。它似乎只是偶然起作用,因为有问题的函数恰好不会以任何方式使用this

你的第二个例子很简单,在语法上是不正确的。我甚至不确定你在那里做什么;代码毫无意义。