C ++语法异常,用于实例化派生类

时间:2018-01-30 20:05:22

标签: c++ inheritance

我正在使用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中访问方法吗? 根据我的经验,我总是将派生类声明为指针,然后使用' - >'从基类或派生类访问方法构造。通常情况下,我将派生类存储为指向基类的指针,然后执行转换以在需要访问派生类的方法时进行转换。

非常感谢洞察力。

2 个答案:

答案 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;
}