C++多重继承 父类存在同名函数

比如classIBase1{public:virtualintfunc1()=0;};classIBase2{public:virtualintfunc1()=0;};c... 比如
class IBase1{
public:
virtual int func1() = 0;
};
class IBase2{
public:
virtual int func1() = 0;
};
class Inherit:
virtual public IBase1, virtual public IBase2{
public:
virtual int IBase1::func1(){printf("abc\n"); return 1;}
virtual int IBase2::func1(){printf("123\n"); return 2;}
};
int _tmain(int argc, _TCHAR* argv[])
{
Inherit in;
IBase1 *p1 = ∈ //打印 “abc”
p1->func1();
IBase2 *p2 = ∈ //打印"123"
p2->func1();
//我知道如果用 Inherit调用函数 可以显示的写明父类的名字
}
以上代码都没有问题,因为在Inherit中分别实现了两个基类中的接口(纯虚函数)
现在的问题是:
我必须在派生类中 直接写出实现的代码,即内联的这种样式,我如果跟平时那种在类中仅仅写一个声明,然后在.cpp中,即类的定义外边写函数的定义 不知道怎么写
我这样写
class Inherit:
virtual public IBase1, virtual public IBase2{
public:
virtual int IBase1::func1(){printf("abc\n"); return 1;}
//virtual int IBase2::func1(){printf("123\n"); return 1;} //注掉
virtual int IBase2::func1(); //改成声明
};
int Inherit::IBase2::func1(){
printf("123\n"); return 1;
} 提示 error C2509: “func1”: 成员函数没有在“Inherit”中声明
我如果这样写
int Inherit::func1(){
printf("123\n"); return 1;
} 提示 error C2084: 函数“int Inherit::func1(void)”已有主体
请问正确的语法格式是什么样啊,我查了C++ Primer上面好像也没有讲解。谢谢了。
展开
 我来答
韧劲9
推荐于2016-11-18 · TA获得超过9224个赞
知道小有建树答主
回答量:1638
采纳率:92%
帮助的人:356万
展开全部
int main(int argc, char* argv[])
{
C c;
A* pA = &c;
B* pB = &c;

pA->foo(); //这里会输出和A相关的信息
pB->foo(); //这里会输出和B相关的信息

return 0;
}

// test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>

using namespace std;

class A
{
public:
virtual void foo() {cout<<"A::foo()"<<endl;}
protected:
private:
};

class B
{
public:
virtual void foo() {cout<<"B::foo()"<<endl;}
protected:
private:
};

class MidA:public A
{
public:
virtual void fooCA() {};
virtual void foo()
{
A::foo();
}
protected:
private:
};

class MidB:public B
{
public:
virtual void fooCB() {};
virtual void foo()
{
B::foo();
}
protected:
private:
};

class C:public MidA, public MidB
{

};
int main(int argc, char* argv[])
{
printf("Hello World!\n");
C c;

A* pA = &c;
B* pB = &c;

pA->foo(); //这里会输出和A相关的信息
pB->foo(); //这里会输出和B相关的信息

return 0;
}
Roxxette
推荐于2016-03-04 · TA获得超过828个赞
知道小有建树答主
回答量:1341
采纳率:0%
帮助的人:824万
展开全部

这个特性是微软的扩展,C++ Primer讲的是标准C++,所以不会有这个内容。

解决办法:把IBase声明为__interface

__interface IBase1{
public:
void f();
};
__interface IBase2{
public:
void f();
};
class Inherit : public IBase1, public IBase2{
public:
void IBase1::f();
void IBase2::f();
};
void Inherit::IBase1::f() { printf("IBase1\n"); }
void Inherit::IBase2::f() { printf("IBase2\n"); }

参考链接: http://msdn.microsoft.com/en-us/library/vstudio/ksek8777(v=vs.120).aspx

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Clor001
2013-08-26 · TA获得超过803个赞
知道小有建树答主
回答量:399
采纳率:0%
帮助的人:380万
展开全部
问题出在域名查找。
Inherit::IBase2::

这个含义代表从Inherit类域名找IBase2类域名再找fun1.
尝试把Inherit::去掉吧,没什么用。

这个既不是多态,也不重载,感觉只是把基类的虚函数的实现改到子类中实现了,实现的还是基类的函数。但语法上还是纯虚函数,不能实例化。
而实际上子类并没有生成虚函数,只有一个vptr,而vtable里面没有函数。
更多追问追答
追问
我上面写的 去掉后还是不对。因为普通的单继承情况下 基类是抽象类,子类实现其中的纯虚函数是一种很正常而普遍的做法。语法格式也很简单 就是Inherit::func(); 现在的问题是多继承遇到基类有重名的情况。如果派生类不区分 只写一个Inherit::func();  也能编译通过,但是用父类指针调用的话,就相当于都调用的这一个函数了。
追答
可以在父类调用的时候用域名操作符捞取出来。
多继承并不是一个好的设计思路,重名设计也是一个蹩脚的设计,所以你在用子类的时候也会感觉很难用。
如果作为了解多态可以尝试。
继承来的两个虚函数表肯定会被改写,base1 base2两个镜像也是存在的。

如果想实现接口和实现分离的技术,可以参阅设计模式。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
高禾2W
2013-08-26 · TA获得超过112个赞
知道小有建树答主
回答量:251
采纳率:0%
帮助的人:164万
展开全部
class IBase1{
public:
virtual int func1() = 0;
};
class IBase2{
public:
virtual int func1() = 0;
};

class Inherit:
public virtual IBase1
, virtual public IBase2
{
public:
virtual int IBase1::func1(){printf("IBase1 func1 \n"); return 1;}
virtual int IBase2::func1();//{printf("IBase2 func1 \n"); return 2;}
};
int Inherit::func1()
{
printf("IBase2 func1 \n");
return 0;
}

main中

IBase1 *p1 = new Inherit(); //打印 “IBase1 func1”
p1->func1();

IBase2 *p2 = new Inherit(); //打印"IBase2 func1"
p2->func1();

vc2005是可以编译的过,如何把两个都在类外定义,没有找到方法。
追问
谢谢,我试了一下,可以,但是如果把Inherit 里面 virtual int IBase2::func1();放到 virtual int IBase1::func1(){printf("IBase1 func1 \n"); return 1;}前面 再编译就提示 error C2084: 函数“int Inherit::func1(void)”已有主体 你试一下吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式