class GameBoard
{
public:
GameBoard()
{
std::cout << "GameBoard()" << std::endl;
}
GameBoard(const GameBoard&)
{
std::cout << "GameBoard(const GameBoard&)" << std::endl;
}
GameBoard& operator=(const GameBoard& other)
{
std::cout<< "GameBoard& operator=()" << std::endl;
return *this;
}
~GameBoard()
{
std::cout << "~GameBoard" << std::endl;
}
};
class Game
{
public:
Game()
{
std::cout << "Game()" << std::endl;
}
~Game()
{
std::cout << "~Game()" << std::endl;
}
//显示调用子对象复制构造函数
Game(const Game& other):gb(other.gb)
{
std::cout << "Game(const Game& other)" << std::endl;
}
Game& operator=(const Game& other)
{
gb = other.gb; //显示调用子对象赋值函数
std::cout << "Game& operator=()" << std::endl;
return *this;
}
private:
GameBoard gb;
};
class Checkers : public Game
{
public:
Checkers()
{
std::cout << "Checkers()" << std::endl;
}
~Checkers()
{
std::cout << "~Checkers()" << std::endl;
}
Checkers(const Checkers& other):Game(other) //显示调用基类复制构造函数
{
std::cout << "Checkers(const Checkers& other)" << std::endl;
}
Checkers& operator=(const Checkers& other)
{
Game::operator=(other); //显示调用基类赋值函数
std::cout << "Checkers& operator=()" << std::endl;
}
};
总结:
1.复制构造函数默认调用基类的默认构造函数,不会自动调用基类复制构造函数。当派生类写拷贝构造函数时,要显示调用基类的拷贝构造函数,如下:
Derived(const Derived& d):Base(d)
{
}
2.operator= 不会自动调用基类的operator=,当为派生类写赋值操作符,要显示调用基类版本,如下:
Derived& operator=(const Derived& d)
{
Base::operator=(d);
}