#include <iostream>
#include <string>
class Transaction {
public:
Transaction();
virtual void logTransaction() const = 0;
};
Transaction::Transaction()
{
std::cout << " Transaction::Transaction" << std::endl;
logTransaction();
}
void Transaction::logTransaction() const {
std::cout << " Transaction::logTransaction" << std::endl;
}
class BuyTransaction :public Transaction {
public:
BuyTransaction() {
std::cout << " BuyTransaction::BuyTransaction" << std::endl;
logTransaction();
}
virtual void logTransaction() const {
std::cout << " BuyTransaction::logTransaction" << std::endl;
}
};
int main(int argc, char **argv)
{
BuyTransaction b;
return 0;
}
输出:
#include <iostream>
#include <string>
class A
{
public:
A() :m_iVal(0) { test(); }
virtual void func() { std::cout << m_iVal << " "; }
void test() { func(); }
public:
int m_iVal;
};
class B : public A
{
public:
B() { test(); }
virtual void func()
{
++m_iVal;
std::cout << m_iVal << " ";
}
};
int main(int argc, char* argv[])
{
A*p = new B;
p->test();
return 0;
}
输出:
0 1 2
构造函数不建议调用虚函数。如果构造函数调用虚函数的话,基类的构造函数调用基类的虚函数。派生类的构造函数调用派生类自身的虚函数。派生类实例化的时候,会先调用基类的构造函数,这时候就是调用基类自身的虚函数。然后,派生类调用自身的构造函数,这时候就会调用派生类自身的虚函数。实例化以后,虽然指针声明为基类指针,但实际调用的是派生类的函数。如果派生类里面有两个同样的非虚函数,使用基类指针调用的话会调用基类的函数。