1. Poniższy kod:
class CAnimal
{
// (definicja klasy jest skromna z przyczyn oszczędnościowych :))
public:
virtual void Oddychaj() = 0;
};
Jest nieprawidłowy
>Umożliwia tworzenie obiektów klasy CAnimal
>Jest poprawny
>Metoda CAnimal::Oddychaj() staje się czysto wirtualną funkcją składową
2. Poprawna deklaracja klasy języku w C++ to:
a) class Complex
{
public:
void funkcja();
private:
int zmienna;
};
b) class Complex()
{
public
void funkcja();
private
int zmienna;
};
c) class complex
{
public:
void funkcja;
privat:
int zmienna;
};
d) brak poprawnej odpowiedzi
b)
a) i c)
d)
c)
>a)
3. Poniższy kod:
class CAnimal
{
// (definicja klasy jest skromna z przyczyn oszczędnościowych :))
public:
virtual void Oddychaj() = 0;
};
Uniemożliwia tworzenie klas pochodnych w oparciu o klase CAnimal
Uniemożliwa stworzenie obiektu klasy CAnimal
>Umożliwia tworzenie wskaźników na obieky klasy CAnimal
Jest nieprawidłowy
4. Zdefiniowano klasę moja oraz obiekt ob:
class moja
{ int a;
int b;
public:
int c;
void ustaw(int x){a=b=x;};
void zeruj(){a=b=0;};
} ob;
Zaznacz prawidłowe konstrukcje kodu C++:
ob.a
>ob.zeruj()
>ob.c
ob.ustaw()
5. Czy funkcja wirtualna to funkcja funkcja, która jest zawsze pomijana podczas dziedziczenia
funkcja której nie można zdefiniować poza klasą
funkcja, którą można wykorzystać tylko w dziedziczeniu wielopokoleniowym
>funkcja, którą można nadpisać w klasach pochodnych
6. W języku C++ specyfikatory praw dostępu do składowych klasy:
>public: jest najbardziej liberalnym specyfikatorem. Nie tylko pozwala na odziedziczanie swych składowych, ale także na udostępnianie ich szerokiej rzeszy obiektów poprzez operatory wyłuskania.
protected: składowe zaznaczone przez protected nie są dziedziczone są dostępne tylko dla funkcji zaprzyjaźnionych
private: umożliwia dziedziczenie składowych klasy
>private: poprzedza deklaracje składowych, które mają być dostępne jedynie dla metod definiowanej klasy.
7. Czy klasa abstrakcyjna to klasa:
>klasa dla której nie można stworzyć obiektu
klasa, po której nie można dziedziczyć
klasa, w której występuje co najmniej jeden konstruktor
>klasa, w której występuje co najmniej jedna funkcja w pełni wirtualna
8. Czy słowo kluczowe this:
>jest zmienną wskaźnikową
>jest adresem obiektu
jest adresem klasy
jest zmienną typu float
9. W przypadku dziedziczenia:
>Niestosowanie destruktorów wirtualnych może prowadić do wycieków pamięci, czyli bezpowrotnej utraty zaalokowanej pamięci operacyjnej
Nie należy stosować destruktorów wirtualnych
Konieczne jest definiowanie konstruktorów wirtualnych
>Prawie zawsze konieczne i zalecane jest definiowanie destruktorów wirtualnych
10. Użytkownik zdefiniował klasę A
class A
{
public:
A() { cout<<'+'; }
~A() { cout<<'-'; }
};
i wykorzystał ją w następujący sposób
for ( int i=0; i<2; i++ )
{
A a, b, c;
}
Na ekranie monitora zostanie wypisany napis
+ + + - - - + + + - - -
+ -
+ + + + + + - - - - - -
nie zostanie wypisany żaden napis. Obiekty a, b, c zostały jedynie zadeklarowane ale nie korzystamy z nich. Kompilator dokona stosownej optymalizacji i pominie niewykorzystane deklaracje
11. W przypadku dziedziczenia dla klas pochodnych należy pamiętać że:
>Podczas tworzenia obiektu klasy pochodnej dokonywana jest także kreacja obiektu klasy bazowej, który staje się jego częścią. Zatem nasz obiekt pochodny to tak naprawdę obiekt bazowy plus dodatkowe pola, zdefiniowane w jego własnej klasie.
W C++ obowiązuje zasada, iż najpierw wywoływany jest konstruktor klasy danego obiektu, a następnie kolejno konstruktory klas z których dana klasa dziedziczy - aż do najwyższej klasy bazowej danego obiektu.
Klasa pochodna powinna przejmować wszystkie składowe pochodzące z klasy bazowej - oczywiście z wyjątkiem tych oznaczonych jako private.
>Zadaniem konstruktora jest zazwyczaj inicjalizacja pól klasy na ich początkowe wartości, stworzenie wewnętrznych obiektów czy też alokacja dodatkowej pamięci. Czynności te prawie zawsze wymagają zatem dostępu do prywatnych pól klasy. Z tego też powodu konstruktory nie są dziedziczone.
12. Poprawna deklaracja klasy języku w C++ to:
class complex { public: void funkcja; privat: int zmienna; };
żadna z przedstawionych
>class Complex { public: void funkcja(); private: int zmienna; };
class Complex() { public void funkcja(); private int zmienna; };
13. Rezultatem pracy programu
#include <iostream>
class A
{ public: virtual void f() { cout<<"A"; }};
class B : public A
{ public: void f() { cout<<"B"; } };
int main()
{
A a;
B b;
B& c=b;
A& d=c;
a.f(); b.f(); c.f(); d.f();
return 0;
}
jest napis
ABBA
>ABBB
ABAB
BBBB
14. Użytkownik zdefiniował klasę A
class A
{
public:
A() { cout<<'+'; }
~A() { cout<<'-'; }
};
i wykorzystał ją w następujący sposób
for ( int i=0; i<2; i++ )
{
A a, b, c;
}
Na ekranie monitora zostanie wypisany napis nie zostanie wypisany żaden napis. Obiekty a, b, c zostały jedynie zadeklarowane ale nie korzystamy z nich.
Kompilator dokona stosownej optymalizacji i pominie niewykorzystane deklaracje
+ + + - - - + + + - - -
+ -
+ + + + + + - - - - - -
16. W przypadku dziedziczenia:
>Użycie słowa kluczowego virtual powoduje wczesne wiązanie tj: decyzja, która metoda jest rzeczywiście wywoływana (czy klasy bazowej czy klasy pochodnej), zostaje podjęta już na etapie kompilacji programu.
>Nowa wersja metody całkowicie zastępuje starą, która jest jednak dostępna i w razie potrzeby możemy ją wywołać. Służy do tego konstrukcja: nazwa_klasy_bazowej::nazwa_metody([parametry ]);
>Metoda wirtualna jest przygotowana na zastąpienie siebie przez nową wersję, zdefiniowaną w klasie pochodnej.
Dla obiektu klasy bazowej nie można wywołać metody wirtualnej.
17. Czy klasa abstrakcyjna to klasa:
klasa, po której nie można dziedziczyć
klasa, w której występuje co najmniej jeden konstruktor
>klasa dla której nie można stworzyć obiektu
>klasa, w której występuje co najmniej jedna funkcja w pełni wirtualna
18. Zdefiniowano klasy moja0, moja1 oraz obiekty ob0, ob1:
class moja0
{ int a0; int b0;
public:
int c0;
void ustaw0(int x){a=b=x;};
void zeruj0(){a=b=0;};
} ob0;
class moja1
{ int a1; int b1;
public:
int c1;
void ustaw1(int x){a=b=x;};
void zeruj1(){a=b=0;};
} ob1;
Zaznacz prawidłowe konstrukcje kodu C++
>ob0.zeruj0()
ob1.ustaw1(3.2)
>ob0.c0
ob0.a0
19. Zdefinowano klasę moja
class moja
{ int a; int b;
public:
int c;
moja(){};
moja(int x){a=b=x;};
void zeruj(){a=b=0;};
};
konstrukcja C++ " moja ob.(1000); " jest prawidłowa
w klasie moja występuje przeładowanie funkcji (polimorfizm off-line)
funkcja zeruj jest źle zdefiniowana ponieważ nie ma dostępu do zmiennych w części prywatnej
>klasa moja posiada konstruktor