如何解决这个虚继承的问题?

猫猫爱吃鱼 2018-01-17 10:09:42
代码如下,请帮助解决


#include <stdio.h>
#include <stdint.h>

#ifndef interface
#define interface struct
#endif

#define extends public
#define implements virtual public
#define instanceof(T, ptr) dynamic_cast<T *>(ptr)

interface ILine
{
virtual void open() = 0;
virtual void close() = 0;
};

interface IDataLine : implements ILine
{
virtual void drain() = 0;
virtual void flush() = 0;
virtual void start() = 0;
virtual void stop() = 0;
virtual long available() = 0;
};

interface ISourceDataLine : implements IDataLine
{
virtual void open(void *param, long size) = 0;
virtual void open(void *param) = 0;
virtual long write(void *buf, long size) = 0;
};

class AbstractLine : implements ILine
{
public:
AbstractLine() { printf("AbstractLine::AbstractLine()\n"); }
virtual ~AbstractLine() { printf("AbstractLine::~AbstractLine()\n"); }

virtual void open() { printf("AbstractLine::open()\n"); }
virtual void close() { printf("AbstractLine::close()\n"); }

private:
AbstractLine(const AbstractLine& line);
AbstractLine& operator=(const AbstractLine& line);
};

class AbstractDataLine : extends AbstractLine, implements IDataLine
{
public:
AbstractDataLine() { printf("AbstractDataLine::AbstractDataLine()\n"); }
~AbstractDataLine() { printf("AbstractDataLine::~AbstractDataLine()\n"); }

virtual void drain() { printf("AbstractDataLine::drain()\n"); }
virtual void flush() { printf("AbstractDataLine::flush()\n"); }
virtual void start() { printf("AbstractDataLine::start()\n"); }
virtual void stop() { printf("AbstractDataLine::stop()\n"); }
virtual long available() { printf("AbstractDataLine::available()\n"); return 0; }

private:
AbstractDataLine(const AbstractDataLine& line);
AbstractDataLine& operator=(const AbstractDataLine& line);
};

class DirectSDL : extends AbstractDataLine, implements ISourceDataLine
{
public:
DirectSDL() { printf("DirectSDL::DirectSDL()\n"); }
~DirectSDL() { printf("DirectSDL::~DirectSDL()\n"); }

virtual void open(void *param, long size) { printf("DirectSDL::open(void *param, long size)\n"); }
virtual void open(void *param) { printf("DirectSDL::open(void *param)\n"); }
virtual long write(void *buf, long size) { printf("DirectSDL::write(void *buf, long size)\n"); return 0; }

private:
DirectSDL(const DirectSDL& line);
DirectSDL& operator=(const DirectSDL& line);
};

int main(int argc, char *argv[])
{
DirectSDL *pSDL = new DirectSDL;
ISourceDataLine *pSourceDataLine = pSDL;
IDataLine *pDataLine = pSDL;
ILine *pLine = pSDL;

printf("\n");
pSourceDataLine->open();
pSourceDataLine->start();
pSourceDataLine->write(NULL, 0);
pSourceDataLine->stop();
pSourceDataLine->close();
printf("\n");

delete pSDL;
return 0;
}


当把代码pSourceDataLine->open();改为pLine->open();可以编译通过并可运行,不知道为何会这样?
...全文
215 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2018-01-17
  • 打赏
  • 举报
回复
虽然ISourceDataLine从IDataLine继承,但是他也有过open函数,且这两个open签名不一致,和IDataLine是overloader 且你的ISourceDataLine 这一支继承中并没有实现open()无参,所以你把它转换为ISourceDataLine无法调用open(),只能调用open(参数) ,
paschen 版主 2018-01-17
  • 打赏
  • 举报
回复
ISourceDataLine中的open函数并不是继承自基类中的,因为他们参数不同,它们是两个不同的函数,不存在多态
猫猫爱吃鱼 2018-01-17
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdint.h>

#ifndef interface
#define interface struct
#endif

#define extends public
#define implements virtual public
#define instanceof(T, ptr) dynamic_cast<T *>(ptr)

typedef struct AudioFormat
{
	float sample_rate;
	int channels;
	int sample_bit;
} AudioFormat;

interface ILine
{
	virtual void open() = 0;
	virtual void open(const AudioFormat &format, long size) = 0;
	virtual void open(const AudioFormat &format) = 0;
	virtual void close() = 0;
};

interface IDataLine : implements ILine
{
	virtual void drain() = 0;
	virtual void flush() = 0;
	virtual void start() = 0;
	virtual void stop() = 0;
	virtual long available() = 0;
};

interface ISourceDataLine : implements IDataLine
{
	virtual long write(void *buf, long size) = 0;
};

interface ITargetDataLine : implements IDataLine
{
	virtual long read(void *buf) = 0;
};

class AbstractLine : implements ILine
{
public:
	AbstractLine() { printf("AbstractLine::AbstractLine()\n"); }
	virtual ~AbstractLine() { printf("AbstractLine::~AbstractLine()\n"); }

	virtual void open() { printf("AbstractLine::open()\n"); }
	virtual void open(void *param, long size) { printf("AbstractLine::open(void *param, long size)\n"); }
	virtual void open(void *param) { printf("AbstractLine::open(void *param)\n"); }
	virtual void close() { printf("AbstractLine::close()\n"); }

private:
	AbstractLine(const AbstractLine& line);
	AbstractLine& operator=(const AbstractLine& line);
};

class AbstractDataLine : extends AbstractLine, implements IDataLine
{
public:
	AbstractDataLine() { printf("AbstractDataLine::AbstractDataLine()\n"); }
	~AbstractDataLine() { printf("AbstractDataLine::~AbstractDataLine()\n"); }

	virtual void drain() { printf("AbstractDataLine::drain()\n"); }
	virtual void flush() { printf("AbstractDataLine::flush()\n"); }
	virtual void start() { printf("AbstractDataLine::start()\n"); }
	virtual void stop() { printf("AbstractDataLine::stop()\n"); }
	virtual long available() { printf("AbstractDataLine::available()\n"); return 0; }

private:
	AbstractDataLine(const AbstractDataLine& line);
	AbstractDataLine& operator=(const AbstractDataLine& line);
};

class DirectSDL : extends AbstractDataLine, implements ISourceDataLine
{
public:
	DirectSDL() { printf("DirectSDL::DirectSDL()\n"); }
	~DirectSDL() { printf("DirectSDL::~DirectSDL()\n"); }

	virtual void open() { printf("DirectSDL::open()\n"); }
	virtual void open(const AudioFormat &format, long size) { printf("DirectSDL::open(const AudioFormat &format, long size)\n"); }
	virtual void open(const AudioFormat &format) { printf("DirectSDL::open(const AudioFormat &format)\n"); }
	virtual long write(void *buf, long size) { printf("DirectSDL::write(void *buf, long size)\n"); return 0; }

private:
	DirectSDL(const DirectSDL& line);
	DirectSDL& operator=(const DirectSDL& line);
};

class DirectTDL : extends AbstractDataLine, implements ITargetDataLine
{
public:
	DirectTDL() { printf("DirectTDL::DirectTDL()\n"); }
	~DirectTDL() { printf("DirectTDL::~DirectTDL()\n"); }

	virtual void open() { printf("DirectTDL::open()\n"); }
	virtual void open(const AudioFormat &format, long size) { printf("DirectTDL::open(const AudioFormat &format, long size)\n"); }
	virtual void open(const AudioFormat &format) { printf("DirectTDL::open(const AudioFormat &format)\n"); }
	virtual long read(void *buf) { printf("DirectTDL::read(void *buf)\n"); return 0; }

private:
	DirectTDL(const DirectTDL& line);
	DirectTDL& operator=(const DirectTDL& line);
};

int main(int argc, char *argv[])
{
	DirectSDL *pSDL = NULL;
	DirectTDL *pTDL = NULL;
	ISourceDataLine *pSourceDataLine = NULL;
	ITargetDataLine *pTargetDataLine = NULL;
	IDataLine *pDataLine = NULL;
	ILine *pLine = NULL;
	AudioFormat format = {0};

	pSDL = new DirectSDL;
	pSourceDataLine = pSDL;
	pDataLine = pSDL;
	pLine = pSDL;

	printf("\n");
	pSourceDataLine->open();
	pSourceDataLine->open(format);
	pSourceDataLine->open(format, 88200);
	pSourceDataLine->start();
	pSourceDataLine->write(NULL, 0);
	pSourceDataLine->stop();
	pSourceDataLine->close();
	printf("\n");

	delete pSDL;
	printf("\n");

	pTDL = new DirectTDL;
	pTargetDataLine = pTDL;
	pDataLine = pTDL;
	pLine = pTDL;

	printf("\n");
	pTargetDataLine->open();
	pTargetDataLine->open(format);
	pTargetDataLine->open(format, 88200);
	pTargetDataLine->start();
	pTargetDataLine->read(NULL);
	pTargetDataLine->stop();
	pTargetDataLine->close();
	printf("\n");

	delete pTDL;

	return 0;
}
我把ISourceDataLine里的两个open函数提升到ILine里,就可以调用了。
猫猫爱吃鱼 2018-01-17
  • 打赏
  • 举报
回复
我声明的ISourceDataLine从IDataLine继承,而IDataLine从ILine继承,ILine的声明里定义了open()这个函数,为何无法调用呢?
真相重于对错 2018-01-17
  • 打赏
  • 举报
回复
ISourceDataLine *pSourceDataLine = pSDL; 不准确的说 pSourceDataLine->open() 调用的是 ISourceDataLine的open, 而那个Open需要两个参数!
猫猫爱吃鱼 2018-01-17
  • 打赏
  • 举报
回复
什么意思?没看懂
真相重于对错 2018-01-17
  • 打赏
  • 举报
回复
virtual void open(void *param, long size) = 0;

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧