C++ 找出c++;多态类型的指针是否有效?

C++ 找出c++;多态类型的指针是否有效?,c++,pointers,C++,Pointers,在windows visual studio编译器上,我有以下代码: #include <iostream> #include <string> class A { public: A() : m_i(0) { } protected: int m_i; }; class B { public: B() : m_d(0.0) { } protected: double m_d; }; class C : public A, pu

在windows visual studio编译器上,我有以下代码:

#include <iostream>
#include <string>

class A
{
public:
     A() : m_i(0) { }

protected:
    int m_i;
};

class B
{
public:
    B() : m_d(0.0) { }

protected:
    double m_d;
};

class C : public A, public B
{
public:
    C() : m_c('a') { }
private:
    char m_c;
};

int main()
{
    C c;
    A *pa = &c;
    B *pb = &c;

    std::cout << "&c address:  " << &c << std::endl;
    std::cout << "pa address:  " << pa << std::endl;
    std::cout << "pb address:  " << pb << std::endl;

    bool paSame(pa == &c);
    bool pbSame = (pb == &c);
    bool pbpaSame = (reinterpret_cast<char*>(pa) == reinterpret_cast<char*>(pb));

    std::cout << std::endl;
    std::cout << "paSame:   " << paSame << std::endl;
    std::cout << "pbSame:   " << pbSame << std::endl;
    std::cout << "pbpaSame: " << pbpaSame << std::endl;

    return 0;
}
为什么pa的&c和地址相同,是因为在内存中对象的布局中,A的数据排在第一位吗

我理解为什么pb偏移8字节,因为它指向该类型对象中的内存部分。打印出的指针不同,但此行的计算结果仍然为true:

bool pbSame = (pb == &c);
为什么呢?这是有道理的,因为他们是同一个对象,但这方面的规则是什么?因为下一行(如预期比较pa和pb的指针)显示指针不同。

由于自动转换规则,表达式
(pb==&c)
的计算结果为
true
<代码>&c转换为
B*
,在进行比较之前,它指向
c
B
部分

<>从C++草案标准N33 37:< /P> 4.10指针转换

3“指向cv的指针
D
”类型的PR值,其中
D
是类类型,可以转换为“指向cv的指针
B
”类型的PR值,其中
B
D
的基类(第10条)。如果
B
D
的不可访问(第11条)或不明确(10.2)基类,则需要进行此转换的程序格式不正确。转换的结果是指向派生类对象的基类子对象的指针


这里没有多态类型。理解/阅读这一点有困难:我理解它说指针可以在从派生类到基类的情况下自动转换,但在比较表达式中,&c不是从基类到派生类(这可能是错误的)自动转换会是一个奇怪的选择吗?@Chanakya,“&c”的类型是
c*
,在比较之前转换为
B*
。它自动从派生类型指针转换为基类型指针。
bool pbSame = (pb == &c);