В этом конкретном случае std :: string имеет метод c_str, который возвращает const char *. Вы можете сделать параллельную версию C, а затем сделать свой C ++ что-то вроде:
void Read_wav::read_wav(const string &filename)
{
do_read_wav(internal_read_wav, filename.c_str());
}
, где do_read_wav - ваша подпрограмма C, а internal_read_wav - указатель на структуру C-стиля.
void do_read_wav(struct Read_wav rw, const char * filename)
Теперь, если вы храните информацию в классе, вам нужно создать C struct [все поля должны быть POD и т. д.]
Заявленный тип a
- A
.
У A есть только два метода: один принимает A (и b и c являются экземплярами A), а другой - D (и ни b, ни c не являются экземплярами D).
Итак, первый метод соответствует, а второй нет. Таким образом, первый метод выбирается компилятором.
Этот метод переопределен в B, и конкретный тип a
- B, поэтому печатается «B и A».
Метод B.show(B)
не переопределяет метод A.show(A)
, поскольку он не принимает тот же тип, что и аргумент.
Здесь есть две концепции: одна - перегрузка, а другая - переопределение. Когда вы создаете A a = new B (); это означает, что объект B и имеет тип A. Поэтому, когда выполняется a.show (a), он сначала встречает метод show (A obj) и show (B obj) класса A, а затем сопоставляет параметр с типом A, но «a» является экземпляром B, поэтому метод show (A obj) класса B.
Теперь, когда a.show (c) выполняется, он сначала сталкивается с методами show (A obj) и show (B obj) класса A, а затем не находит соответствия с параметром типа C внутри класса A, но все же он выполняется потому, что класс C расширяет B, а B расширяет A.
Короче говоря, мы можем сказать, что a.show (a) эквивалентен a.show (b) и эквивалентен a. шоу (с).