我对纯虚函数有疑问。我不清楚它是如何工作的以及何时我们需要使用纯虚函数。这是我不明白的例子:
file.h
class A
{
public :
A();
~A();
virtual void func1(void) = 0;
virtual UINT32 func2(void) = 0;
UINT32 initialize(void) = 0;
}
file.cpp
UINT32 A:initialize (void)
{
func1();
func2();
return (result);
}
任何人都可以详细解释这个例子实际上做了什么以及结果是什么? 我非常感谢你的帮助和知识。非常感谢你。
答案 0 :(得分:1)
(注意,initialize()
的声明不应该是虚拟的,initialize()
的实现可能应该返回func2()
。因为这是一个例子,它并不重要initialize()
可以,但它应该正确编译。)
虚函数的主要目的是实现多态。
类A
定义了两个纯虚方法,initialize
调用它们。这允许程序中的代码在不知道子类的情况下初始化类型A
的某些内容。可能有许多A
的子类,每个子类在func1()
和func2()
中可能会略有不同。由于只知道A
的代码有时会通过A
初始化不同类型的对象,因此A
可以称为多态类型。
class B : public A {
void func1 () { std::cout << "B::func1" << std::endl; }
UINT32 func2 () { return 1; }
};
class C : public A {
void func1 () { std::cout << "C::func1" << std::endl; }
UINT32 func2 () { return 2; }
};
void call_initialize (A *a) {
std::cout << a->initialize() << std::endl;
}
B b;
C c;
call_initialize(&b);
call_initialize(&c);
输出结果:
B::func1
1
C::func1
2
这是多态行为的一个示例,因为输出是不同的,具体取决于A
或B
是否C
子类化。
答案 1 :(得分:0)
功能func1
&amp; func2
未在A中实现(根据显示的代码)
如果它们被实现,那么它们就会被调用。如果有A的派生类,并且派生类的对象是多态创建的,即
class B : public A
{
.....
};
A* obj = new B();
obj->initialize();
如果B实现了B版本的func1()和func2(),则会调用它们。
正如Ethan的评论所述,你没有从func2()中获取结果 所以你需要写
UINT32 result = func2();
或
return func2();