http://ilewen.com/questions/6423
class I
{
public:
virtual void foo() = 0;
};
class J
{
public:
virtual void foo() = 0;
};
class C : public I, public J
{
public:
virtual void I::foo() { cout << "I" << endl; }
virtual void J::foo() { cout << "J" << endl; }
};
上面的代码编译和运行都没问题,现在我想把I::foo() 和 J::foo() 的定义移到类申明外,如下
class C : public I, public J
{
public:
virtual void I::foo();
virtual void J::foo();
};
void C::I::foo() { cout << "I" << endl; }
void C::J::foo() { cout << "J" << endl; }
编译报错
1>.\main.cpp(38) : error C2509: 'foo' : member function not declared in 'C'
1> .\main.cpp(31) : see declaration of 'C'
1>.\main.cpp(39) : error C2509: 'foo' : member function not declared in 'C'
1> .\main.cpp(31) : see declaration of 'C'
请问要把那两个函数的定义移出来应该怎么做呢?
|
用FUNCTION显示函数名发现I::foo和J::foo的函数名都是C::foo,在其他地方恐怕没有办法区别这两个函数了:
//DECLARATION
class C : public I, public J
{
public:
virtual void I::foo() { fooI(); }
virtual void J::foo() { fooJ(); }
void fooI();
void fooJ();
};
//IMPLEMENTATION
void C::fooI() { cout << "I" << endl; }
void C::fooJ() { cout << "J" << endl; }
|
http://stackoverflow.com/questions/5481356/overriding-qualified-virtual-methods
I have C++ class with multiple parents; each parent defines a function with a common name but a different purpose:
class BaseA
{
virtual void myFunc(); // does some task
};
class BaseB
{
virtual void myFunc(); // does some other task
};
class Derived : public BaseA, public BaseB;
If that was it, I would have no problem - I could resolve the ambiguity it with a using statement, and I could choose which one to call using the base class names and the scope resolution operator.
Unfortunately, the derived class needs to override them both:
class Derived : public BaseA, public BaseB
{
virtual void BaseA::myFunc(); // Derived needs to change the way both tasks are done
virtual void BaseB::myFunc();
}
This doesn't work, not because it introduces a new ambiguity (although it may), but because
"error C3240: 'myFunc' : must be a non-overloaded abstract member function of 'BaseA'"
"error C2838: illegal qualified name in member declaration"
Under different circumstances I might just rename the methods, or make them pure virtual as the compiler suggests. However, the class hierarchy structure and a number of external issues make the first option extremely difficult, and the second impossible.
Does anyone have a suggestion? Why are qualifiers only allowed for pure virtual methods? Is there any way to simultaneously override virtual methods and resolve ambiguities?
I think this is a workaround:
class BaseA
{
protected:
virtual void myFunc(); // does some task
};
class BaseB
{
protected:
virtual void myFunc(); // does some other task
};
class ShimA : virtual BaseA
{
virtual void myFunc() { myFuncA(); }
protected:
virtual void myFuncA() { BaseA::myFunc(); }
};
class ShimB : virtual BaseB
{
virtual void myFunc() { myFuncB(); }
protected:
virtual void myFuncB() { BaseB::myFunc(); }
};
class Derived : public virtual BaseA, public virtual BaseB, protected ShimA, protected ShimB
{
virtual void myFuncA() {}
virtual void myFuncB() {}
};