2012-01-18 91 views
0

在我的头文件扩展抽象类为Class1我:混乱了在C++

class Class1 : Class2::Callback { 

    public: 

    //Class2::Callback method 
    virtual bool class2Method(int i); 

} 

Class1.cxx我:

bool Class1::class2Method(int i) { 
    if (i == 1) return true; 
    return false; 
} 

在另一个地方,我有:

IWantAClass2Callback((Class2::Callback)instanceOfClass1); 

当我尝试编译时,出现以下错误:

MyApp.cxx In constructor 'MyApp()': 
MyApp.cxx:55:55: error: 'Class2::Callback is an inaccessible base of Class1' 
MyApp.cxx:55:55: error: cannot allocate an object of abstract type 'Class2::Callback' 
Class2.h:16:10: note: because the following virtual functions are pure within 'Class2::Callback' 
Class2.h:19:18: note: virtual bool Class2::Callback::class2Method(int) 

我在做什么错?

这里是在Class2.h定义的Class2::Callback定义:

class Class2 
{ 
public: 
    struct Callback { 
    virtual bool class2Method(int i) = 0; 
    }; 
} 

回答

3

你在这里使用private inheritance。的Class1声明应该是这样的:

class Class1 : public Class2::Callback { // note the keyword "public" here 
public: 
    //Class2::Callback method 
    virtual bool class2Method(int i); 
}; 
+0

加上'public'关键字后,我仍然得到同样的错误 – fredley 2012-01-18 12:50:39

+0

然后,你需要向我们展示更多的代码。具体来说就是'Class2 :: Callback'的定义。 – 2012-01-18 12:52:09

+0

我已经添加了代码 – fredley 2012-01-18 12:57:06

1

在C++的类的默认访问说明符是private:

class Class1 : public Class2::Callback 

应该做的伎俩。这或使它的默认访问说明符是公共的结构。

0

回调必须驻留在public:区域的Class2,是这样吗?我的意思是:

class Class2 { 
public: 
    class Callback { 
     virtual bool class2Method(int) = 0 
    }; 
}; 
+0

是的,就是这样。 – fredley 2012-01-18 12:57:46

1

还有就是在你的代码的两个问题:

  1. 正如许多指出的那样,你使用私有继承,而不是公共 之一。

  2. 转换为Class2::Callback时使用切片:(Class2::Callback)instanceOfClass1。要使用多态性,你需要一个指针或引用。假设你已经IWantAClass2Callback以下签名:

    void IWantAClass2Callback(Class2::Callback&);

    (返回类型并不重要),正确的调用是:

    IWantAClass2Callback(instanceOfClass1);

0

你真的有

IWantAClass2Callback((Class2::Callback)instanceOfClass1); 

在那里?你期望它做什么?你可以投射指针和引用,但没有实例。

尝试更改签名

void IWantAClass2Callback(Class2::Callback &instance) 

,并呼吁

IWantAClass2Callback((Class2::Callback&)instance) 
+0

或者只是'IWantAClass2Callback(instance)',因为转换是隐式的(一旦私有继承问题被修复)。显式转换只能在你想要做一些奇怪的事情时才使用,否则会有意外做出奇怪事情的危险。 – 2012-01-18 15:47:12

+0

在这种情况下,你是对的,因为'Class2 :: Callback'是接口 - 因此任何东西的基类都通过了。我只是想坚持原始问题中给出的语法。 – Coder02 2012-01-19 07:08:56