有两个基类具有相同的函数名.我想继承它们,并以不同的方式搭乘每种方法.如何使用单独的声明和定义(而不是在类定义中定义)?
#include <cstdio>
class Interface1{
public:
virtual void Name() = 0;
};
class Interface2
{
public:
virtual void Name() = 0;
};
class RealClass: public Interface1, public Interface2
{
public:
virtual void Interface1::Name()
{
printf("Interface1 OK?\n");
}
virtual void Interface2::Name()
{
printf("Interface2 OK?\n");
}
};
int main()
{
Interface1 *p = new RealClass();
p->Name();
Interface2 *q = reinterpret_cast<RealClass*>(p);
q->Name();
}
Run Code Online (Sandbox Code Playgroud)
我没能在VC8中移出定义.我发现Microsoft特定关键字__interface可以成功完成这项工作,代码如下:
#include <cstdio>
__interface Interface1{
virtual void Name() = 0;
};
__interface Interface2
{
virtual void Name() = 0;
}; …Run Code Online (Sandbox Code Playgroud) 我有类似的东西(简化)
class A
{
public:
virtual void Function () = 0;
};
class B
{
public:
virtual void Function () = 0;
};
class Impl : public A , public B
{
public:
????
};
Run Code Online (Sandbox Code Playgroud)
如何为A实现Function()和为B实现Function()?Visual C++允许您只定义内联的特定函数(即不在cpp文件中),但我认为它是一个扩展.海湾合作委员会抱怨这一点.是否有标准的C++方式告诉编译器我要覆盖哪个函数?
(visual c ++ 2008)
class Impl : public A , public B
{
public:
void A::Function () { cout << "A::Function" << endl; }
void B::Function () { cout << "B::Function" << endl; }
};
Run Code Online (Sandbox Code Playgroud)
谢谢!
我有多个父母的C++课程; 每个父级定义一个具有通用名称但具有不同目的的函数:
class BaseA
{
virtual void myFunc(); // does some task
};
class BaseB
{
virtual void myFunc(); // does some other task
};
class Derived : public BaseA, public BaseB;
Run Code Online (Sandbox Code Playgroud)
如果就是这样,我就没有问题 - 我可以使用using语句解决它的歧义,我可以选择使用基类名称和范围解析运算符来调用哪一个.
不幸的是,派生类需要覆盖它们:
class Derived : public BaseA, public BaseB
{
virtual void BaseA::myFunc(); // Derived needs to change the way both tasks are done
virtual void BaseB::myFunc();
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,不是因为它引入了新的歧义(虽然它可能),但是因为
"错误C3240:'myFunc':必须是'BaseA'的非重载抽象成员函数"
"错误C2838:成员声明中的非法限定名称"
在不同的情况下,我可能只是重命名方法,或者像编译器建议的那样使它们成为纯虚方法.但是,类层次结构和许多外部问题使得第一个选项非常困难,第二个选项不可能.
有没有人有建议?为什么限定符仅允许纯虚方法?有没有办法同时覆盖虚拟方法和解决歧义?