2014-09-11 154 views
0

以下哪段代码中的哪条语句正确,为什么?指向派生类对象的基指针的值

class ClassA 
{ 
public: 
    virtual ~ ClassA(){}; 
    virtual void FunctionA(){}; 
}; 

class ClassB 
{ 
public: 
    virtual void FunctionB(){}; 
}; 

class ClassC : public ClassA,public ClassB 
{ 
public: 
}; 


int main(){ 
    ClassC aObject; 
    ClassA* pA=&aObject; 
    ClassB* pB=&aObject; 
    ClassC* pC=&aObject; 
    return 0; 
} 
  1. pApBpC的值是相同的;
  2. pC = pA + pB;
  3. pA与pB不同;
  4. pApB都不等于pC;

任何人都可以在基类指针指向派生对象的现象下解释真实的故事吗?不是简单地存储派生类对象的起始地址?

+0

我刚刚讲过Effective C++,它在第27条中说过'这里我们只是创建一个基类指向派生类对象的指针,但有时候,这两个指针值将不会相同。当出现这种情况时,运行时会将偏移量应用于Derived *指针以获取正确的Base *指针值。 – qingjinlyc 2014-09-11 02:54:56

+0

3总是如此。 2和4也可以是真实的,这取决于你的编译器。没有单一的答案。 – EJP 2014-09-11 03:10:42

回答

0

pA指向ClassA类型的对象。 pB指向一个ClassB类型的对象。 pC指向一个ClassC类型的对象。他们的声明是这样说的。

ClassC类型的对象包含ClassA类型的对象和ClassB类型的对象。 ClassA和ClassB不重叠。因此,其中只有一个可能在ClassC的开头。如果说ClassA在ClassC的开头,那么pA和pC将会在同一个地址上出现。另一个将从一开始就有一些偏移。从理论上讲,这可能发生在一开始都不是。

所以唯一的说法总是正确的是C:pA与pB不同。