C++调用超类

问题描述:

我主要是一个Java和AS3程序员,但现在我正在用C++工作,而我偶然发现了一个问题。 我有一个基类(我们称之为ClassA),它有一个私有变量var1。在这个类中,我有一个方法getVar1(),它返回一个指向该变量的指针。C++调用超类

接下来我有另一个扩展基类(让我们称之为ClassB)的类。我如何从超类调用getVar1()? 在java中它就像this.var1 = super.getVar1()一样简单。

我读到它就像var1 = ClassA :: getVar1(),但我不确定这是否可以使用变量(又名指针可以更改)。

谢谢。

+0

没有'因为多重继承的super'。 – 2012-02-28 11:17:23

+2

嗯私人变量与获取访问器,返回一个指针 - 好... – Ricibob 2012-02-28 11:22:29

+0

@Ricibob我知道这不是很好,但它不是我的代码。我正在写很久以前写的其他东西。可悲的是,没有时间重构一切。 – 2012-02-28 11:25:34

可以称之为ClassA :: getVar1()。

但是,如果你想要java方式,你可以使方法“虚拟”。这意味着每当你编写getVar1()时,它不依赖于你在它之前编写的类型(所以在编译时),但它取决于在调用它时(运行时)的对象类型。出于这个原因,C++保留一个内部的v表来找到合适的方法。它相当于java的方式,并称为后期绑定。

getVar1()应该足够

class ClassB : public ClassA 
{ 
... 
    void foo() { yourvartype* v = getVar1(); ... } 
}; 

如果OTOH已经定义的其他getVar1()ClassB然后ClassA::getVar1()应该用来帮助编译器,以确定调用哪个函数。

这里是在一个小例子会发生什么: - 一个在10 初始化X - B在20 下面你初始化x可以看到功能如何虚拟来电锻炼,如何调用你的父母无效(即使你初始化值不同)

要记住最重要的事情是,即使你打电话给你的超级功能(A ::信息getX),它仍然会使用自己的类值(B :: X)

class A 
{ 
public: 
    A::A() : x(10) {} 
virtual int GetX() {return x*2;} 
protected: 
    int x; 
}; 

class B : public A 
{ 
public: 
    B::B() : A() 
    { 
     x = 20; 
    } 
    virtual int GetX() {return x;} 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    A* a1 = new A(); 
    B* b1 = new B(); 
    int test1 = a1->GetX(); // returns 20 (because x is 10, but function doubles value) 
    int test2 = b1->GetX(); // returns 20 (because x is initialized at 20) 
    return 0; 
} 

现在,如果我们陈GE的B ::的getX到:

virtual int GetX() {return A::GetX();} 

我们得到以下结果:

int _tmain(int argc, _TCHAR* argv[]) 
{ 
A* a1 = new A(); 
B* b1 = new B(); 
int test1 = a1->GetX(); //returns 20 (as previously) 
int test2 = b1->GetX(); // return 40 (x is initialized by B at 20, but then the 
         // A:GetX is called, which doubles the result) 
return 0; 
}