C++调用超类
问题描述:
我主要是一个Java和AS3程序员,但现在我正在用C++工作,而我偶然发现了一个问题。 我有一个基类(我们称之为ClassA),它有一个私有变量var1。在这个类中,我有一个方法getVar1(),它返回一个指向该变量的指针。C++调用超类
接下来我有另一个扩展基类(让我们称之为ClassB)的类。我如何从超类调用getVar1()? 在java中它就像this.var1 = super.getVar1()一样简单。
我读到它就像var1 = ClassA :: getVar1(),但我不确定这是否可以使用变量(又名指针可以更改)。
谢谢。
答
可以称之为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;
}
没有'因为多重继承的super'。 – 2012-02-28 11:17:23
嗯私人变量与获取访问器,返回一个指针 - 好... – Ricibob 2012-02-28 11:22:29
@Ricibob我知道这不是很好,但它不是我的代码。我正在写很久以前写的其他东西。可悲的是,没有时间重构一切。 – 2012-02-28 11:25:34