派生中的 C++ 纯虚函数实现 class
C++ pure virtual functions implementation in derived class
我有一个topAPI(基于抽象class),它由base组成API(将被不同的 top APIs 重复使用)。
class api_base {
public:
virtual int foo() = 0;
};
class api_top : public api_base {
public:
virtual int bar() = 0;
}
然后,我想为基础API提供一个基础实现:
class imp_base {
public:
int foo() { return 1; }
}
最后使用基本实现实现 top API 那些在基本 API:
中定义的函数
class imp_top : public api_top, public imp_base {
public:
int bar() { return 1; }
}
当我实例化一个 imp_top
类型的对象时,编译器说 foo()
函数没有实现。但事实并非如此,因为 imp_top
派生自 imp_base
,它确实实现了 foo()
功能。
对此有什么建议吗?
提前谢谢你。
完整测试代码:
#include <stdio.h>
class api_base {
public:
virtual int foo() = 0;
};
class api_top : public api_base {
public:
virtual int bar() = 0;
};
class imp_base {
public:
int foo() { printf("foo from imp_base\n"); }
};
class imp_top : public api_top, public imp_base {
public:
int bar() { printf("bar from imp_top\n"); }
};
int main()
{
printf("Hello\n");
imp_top a;
a.bar();
a.foo();
return 1;
}
编译结果:
test.cpp:26:12: error: cannot declare variable ‘a’ to be of abstract type ‘imp_top’
imp_top a;
^
test.cpp:18:7: note: because the following virtual functions are pure within ‘imp_top’:
class imp_top : public api_top, public imp_base {
^
test.cpp:5:17: note: virtual int api_base::foo()
virtual int foo() = 0;
^
test.cpp:29:6: error: request for member ‘foo’ is ambiguous
a.foo();
^
test.cpp:15:9: note: candidates are: int imp_base::foo()
int foo() { printf("foo from imp_base\n"); }
^
test.cpp:5:17: note: virtual int api_base::foo()
virtual int foo() = 0;
您应该使用了 override
关键字,然后您会注意到您没有实现接口,而是定义了一个全新的 foo()
方法。
您需要通过虚拟继承从 api_base
派生出 imp_base
和 api_top
。
变化:
class api_top : public api_base
到 class api_top : public virtual api_base
和:
class imp_base
到 class imp_base : public virtual api_base
然后就可以了。
要了解这一点,请参阅:virtual inheritance。是的(刚刚看到 Ext3h 的 post),使用 override
关键字。
首先在子 类 中重新定义函数时始终使用 override
关键字。
二读虚拟继承。
以下作品:
class api_base {
public:
virtual int foo() = 0;
};
class api_top : public virtual api_base {
public:
virtual int bar() = 0;
};
class imp_base : public virtual api_base {
public:
int foo() override { printf("foo from imp_base\n"); return 0; }
};
class imp_top : public api_top, public imp_base {
public:
int bar() override { printf("bar from imp_top\n"); return 0; }
};
int main(){
imp_top a;
a.bar();
a.foo();
return 1;
}
我有一个topAPI(基于抽象class),它由base组成API(将被不同的 top APIs 重复使用)。
class api_base {
public:
virtual int foo() = 0;
};
class api_top : public api_base {
public:
virtual int bar() = 0;
}
然后,我想为基础API提供一个基础实现:
class imp_base {
public:
int foo() { return 1; }
}
最后使用基本实现实现 top API 那些在基本 API:
中定义的函数class imp_top : public api_top, public imp_base {
public:
int bar() { return 1; }
}
当我实例化一个 imp_top
类型的对象时,编译器说 foo()
函数没有实现。但事实并非如此,因为 imp_top
派生自 imp_base
,它确实实现了 foo()
功能。
对此有什么建议吗?
提前谢谢你。
完整测试代码:
#include <stdio.h>
class api_base {
public:
virtual int foo() = 0;
};
class api_top : public api_base {
public:
virtual int bar() = 0;
};
class imp_base {
public:
int foo() { printf("foo from imp_base\n"); }
};
class imp_top : public api_top, public imp_base {
public:
int bar() { printf("bar from imp_top\n"); }
};
int main()
{
printf("Hello\n");
imp_top a;
a.bar();
a.foo();
return 1;
}
编译结果:
test.cpp:26:12: error: cannot declare variable ‘a’ to be of abstract type ‘imp_top’
imp_top a;
^
test.cpp:18:7: note: because the following virtual functions are pure within ‘imp_top’:
class imp_top : public api_top, public imp_base {
^
test.cpp:5:17: note: virtual int api_base::foo()
virtual int foo() = 0;
^
test.cpp:29:6: error: request for member ‘foo’ is ambiguous
a.foo();
^
test.cpp:15:9: note: candidates are: int imp_base::foo()
int foo() { printf("foo from imp_base\n"); }
^
test.cpp:5:17: note: virtual int api_base::foo()
virtual int foo() = 0;
您应该使用了 override
关键字,然后您会注意到您没有实现接口,而是定义了一个全新的 foo()
方法。
您需要通过虚拟继承从 api_base
派生出 imp_base
和 api_top
。
变化:
class api_top : public api_base
到 class api_top : public virtual api_base
和:
class imp_base
到 class imp_base : public virtual api_base
然后就可以了。
要了解这一点,请参阅:virtual inheritance。是的(刚刚看到 Ext3h 的 post),使用 override
关键字。
首先在子 类 中重新定义函数时始终使用 override
关键字。
二读虚拟继承。
以下作品:
class api_base {
public:
virtual int foo() = 0;
};
class api_top : public virtual api_base {
public:
virtual int bar() = 0;
};
class imp_base : public virtual api_base {
public:
int foo() override { printf("foo from imp_base\n"); return 0; }
};
class imp_top : public api_top, public imp_base {
public:
int bar() override { printf("bar from imp_top\n"); return 0; }
};
int main(){
imp_top a;
a.bar();
a.foo();
return 1;
}