对不起,很长的帖子,但我需要帮助来理解这一点。
我有下面的代码抛出 _crtisvalidheappointer(block)
#include <iostream>
#include <string>
using namespace std;
#define ASSERT_ERROR
/*#define SOLVE_ASSERT*/
class Player
{
std::string playerName;
public:
Player(std::string &playerName) :playerName(playerName) { cout << "Player Constructed\n"; }
void printPlayerName() const
{
std::cout << playerName << endl;
}
#if defined SOLVE_ASSERT
virtual ~Player() { cout << "Player Destructed\n"; }
#else
~Player() { cout << "Player Destructed\n"; }
#endif
};
#if defined ASSERT_ERROR
class Batsman : virtual public Player
#else
class Batsman : public Player
#endif
{
public:
Batsman(std::string playerName) : Player(playerName) { cout << "Batsman info added\n"; }
~Batsman() { cout << "Batsman Destructed\n"; }
};
int main()
{
Player *ptr = new Batsman("Sachin Tendulkar");
ptr->printPlayerName();
delete ptr;
}
只要我在下面取消注释,我就会解决这个问题。
#define SOLVE_ASSERT
我提到了下面的链接,它说单一继承不会导致问题。 https://stackoverflow.com/a/48792493/8679501
但在我的情况下,我只是使用 virtual 来继承类,这有点强制我使析构函数成为虚拟的。为什么会这样?
为什么下面的代码行没有虚拟继承是合法的,为什么没有虚拟继承?
Player *ptr = new Batsman(playerName);