abstract_class_word.h
#pragma once
#include <iostream>
#include <string>
class word {
protected:
string language;
string native_inscription;
string translation;
public:
word(const string &lang, const string &nat_inscr, const string &transl);
virtual int show() = 0;
virtual int save_to_disk() = 0;
virtual int read_from_disk() = 0;
};
inline word::word(const string &lang, const string & nat_inscr, const string & transl) {
language = lang;
native_inscription = nat_inscr;
translation = transl;
}
英语单词.h
#pragma once
#include "abstract_class_word.h"
using namespace std;
class english_word : public word {
string example_sentence;
static int number;
int id;
public:
english_word() = delete;
english_word(const string &nat_inscr, const string &transl, const string &ex_sentence);
virtual int show() override;
virtual int save_to_disk() override;
virtual int read_from_disk() override;
};
inline english_word::english_word(const string &nat_inscr, const string &transl, const string &ex_sentence) : word(string("EN"), nat_inscr, transl) {
example_sentence = ex_sentence;
id = ++number;
}
inline int english_word::show() {
cout << id << "\t" << native_inscription << "\t->\t" << translation << endl;
cout << "\t" << example_sentence << endl << endl;
return 0;
}
inline int english_word::save_to_disk() {
return 0;
}
inline int english_word::read_from_disk() {
return 0;
}
int english_word::number = 0;
主文件
#include "headers\class_english_word.h"
#include <locale>
int main() {
setlocale(LC_ALL, "RU");
word *wrd;
wrd = new english_word[3] { english_word("cut","рубить","Cut down those trees."),
english_word("run","бежать","Run, Forrest, run!"),
english_word("sow","сеять","You earn what you sew.") };
english_word *ewrd;
ewrd = new english_word[3] { english_word("cut","рубить","Cut down those trees."),
english_word("run","бежать","Run, Forrest, run!"),
english_word("sow","сеять","You earn what you sew.") };
for(auto i = 0; i < 3; ++i)
ewrd[i].show();
for(auto i = 0; i < 3; ++i)
wrd[i].show(); //<<<<<<<<<<<<<< exception!
system("pause");
return 0;
}

指针
wrd既可以指向单个类对象word,也可以指向一个类的数组word,或者指向单个类对象english_word,但不能指向一个类对象数组english_word。这是因为在索引时,下一个元素的地址将被计算为基地址与对象的静态类型的大小及其个数的乘积之和。而在数组中,
english_word[3]元素的地址必须是wrd + sizeof(english_word) * i,即使它sizeof(english_word)大于sizeof(word)。因此,您会在错误的偏移量处获得读数。您可以通过添加一级重定向来修复它: