我正在使用GitHub库并遇到困扰我的派生类实例化。缩写形式,
class A
{
public:
A() {}
int AFunc(void) { return(1); }
};
class B : public A
{
public:
B(void) : A() {}
int BFunc(void) { return(2); }
};
在包含文件中,该类实例化如下:
A &tObject = *(new B());
示例代码然后将'tObject'称为来自A类和/或B类的全局变量调用方法。 例如:
tObject.AFunc();
tObject.BFunc();
所以这就是问题,实例化是否合法? 编译器只是在调用服务类的方法时,说A类没有这样的成员。这个错误对我有意义,我把问题缩小到上面的解释。
虽然我没有广泛的编译器经验,但我已经用C ++编程了很多年。我从未见过这样的结构。
在我的例子中,有人会解释一个对象如何声明为“A类”可以从派生类B中访问方法吗? 根据我的经验,我总是将派生类声明为指针,然后使用' - >'从基类或派生类访问方法构造。通常情况下,我将派生类存储为指向基类的指针,然后执行转换以在需要访问派生类的方法时进行转换。
非常感谢洞察力。
答案 0 :(得分:2)
它不能。编译器是抱怨的权利,这是没有办法有效的。请记住,C ++是一种静态语言,这意味着编译器将尝试在BFunc
中找到一个名为A
的函数,但它不能,因为没有这样的函数。
这可能是某种编译器扩展,但无论如何,这不是合法的标准C ++。最有可能的是,作者希望在BFunc
中使A
成为虚拟方法,这会使访问变得合法。
在我的例子中,是否会有人友好地解释一个对象如何声明为' A'可以从派生类B?
访问方法
如上所述,这不可能。
我总是将派生类声明为指针,然后使用' - >'从基类或派生类访问方法。构造。
您也可以使用引用来完成此操作,而不仅仅是使用指针。虽然这比指针更少,但这可以解释为什么你还没有遇到过这个。
通常情况下,我已将派生类存储为指向基类的指针,然后执行转换以在需要访问派生类的方法时进行转换。
确切地说,这是访问派生类成员的正确方法。然后编译器将知道对象的类型,并且实际上可以找到BFunc
并调用它。现在,如果类型不是真正的B
,那么你有未定义的行为,但是,这是应该做的。
另外,请正确使用您的术语:
该类实例化如下
如果没有涉及模板,则不会发生实例化。您在这里做的唯一事情是声明或更具体地定义名为tObject
的变量。
答案 1 :(得分:0)
//引用声明作为对基类的引用不是问题,实际上是在某些STL实现中执行的。
class A
{
};
class B : public A
{
public:
void f1() {}
};
int main()
{
A * a = new B; // You know its OK using pointers
A & a2 = *(new B); // Also OK, a2 is a reference for a place in memory which is-a-kind-of A
// a2.f1(); // Will not compile - compiler only knows for sure its of type A
((B&) a2).f1(); // This will work. There is really a B there
return 0;
}